我有两个类,一个通过注册类型设置容器,另一个包含要注入(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)相同的类实例。