我有两个类,一个通过注册类型设置容器,另一个包含要注入(inject)的静态属性。我的问题是该属性永远不会通过注入(inject)设置,因此当我在其上调用方法时,该属性始终为null。

public class ClassOne
{
    public void Method()
    {
        Container.RegisterType<IClass, ClassImplOne>("ImplOne");
        Container.RegisterType<IClass, ClassImplTwo>("ImplTwo");
    }
}

public static class ClassTwo
{
    [Dependency]
    public static IClass SomeProperty { get; set; }

    public static void SomeOtherMethod()
    {
        SomeProperty.AnotherMethod();
    }
}

如果我删除Dependency属性,并在ClassOne中做一个简单的
ClassTwo.SomeProperty = Container.Resolve<IClass>("ImplOne");

它工作正常,但我想知道是否可以在不显式分配属性值的情况下做到这一点(即容器可以通过属性注入(inject))吗?

编辑:

谢谢。我从ClassTwo中删除了静态声明,并在ClassOne中添加了RegisterType和ClassTwo的Resolve,还添加了InjectionProperty:
Container.RegisterType<IClass, ClassImplOne>("ImplOne", new InjectionProperty("SomeProperty"));

但它仍然不起作用:S

最佳答案

通过Unity解析类时,Unity会注入(inject)依赖项。无法创建静态类,因此Unity无法注入(inject)依赖项。

代替使用Static类,而使用Unity来解析ClassTwo的伪单类(ContainerControlledLifetimeManager)。这样,当创建IClass时(通过Unity容器解析),Unity会将ClassTwo注入(inject)ClassTwo中,并且按照配置为单例的方式,您在应用程序的整个生命周期中都始终具有相同的ClassTwo实例。

您必须通过Unity解析ClassTwo。

Container.RegisterType<IClass, ClassImplOne>("ImplOne");
Container.RegisterType<IClass, ClassImplTwo>("ImplTwo");
Container.RegisterType<InterfaceImplemetedByClassTwo, ClassTwo>();

//Simple example. Don't forget to use ContainerControlledLifetimeManager for ClassTwo to simulate sigleton.

当您需要ClassTwo时:
Container.Resolve<InterfaceImplemetedByClassTwo>

在ClassTwo中具有配置:
public class ClassTwo : InterfaceImplemetedByClassTwo
{
    [Dependency("ImplOne")] //inject ClassImplOne
    public IClass SomeProperty { get; set; }

但是这不是一个很好的解决方案,我认为您的问题在于DI的原理。您需要从应用程序的顶层类中级联依赖关系。以显式方式解析顶层类。 (Container.Resolve)和依赖注入(inject)由于Unity的魔力而逐渐降低。当2个类(是否为顶层)需要使用相同的ClassTwo实例时,如果将ClassTwo配置为ContainerControlledLifetimeManager,则需要进行肮脏的工作。

换句话说,您不需要静态类,您可以在不需要的类中注入(inject)相同的类实例。

09-07 06:46