C# 如何使用Ioc Unity注入依赖项属性
我有以下课程:C# 如何使用Ioc Unity注入依赖项属性,c#,inversion-of-control,unity-container,ioc-container,property-injection,C#,Inversion Of Control,Unity Container,Ioc Container,Property Injection,我有以下课程: public interface IServiceA { string MethodA1(); } public interface IServiceB { string MethodB1(); } public class ServiceA : IServiceA { public IServiceB serviceB; public string MethodA1() { return "MethodA1() "
public interface IServiceA
{
string MethodA1();
}
public interface IServiceB
{
string MethodB1();
}
public class ServiceA : IServiceA
{
public IServiceB serviceB;
public string MethodA1()
{
return "MethodA1() " +serviceB.MethodB1();
}
}
public class ServiceB : IServiceB
{
public string MethodB1()
{
return "MethodB1() ";
}
}
我为国际奥委会使用Unity,我的注册如下:
container.RegisterType<IServiceA, ServiceA>();
container.RegisterType<IServiceB, ServiceB>();
container.RegisterType();
container.RegisterType();
当我解析ServiceA
实例时,serviceB
将null
。
如何解决此问题?您在此处至少有两个选项: 您可以/应该使用构造函数注入,为此您需要一个构造函数:
public class ServiceA : IServiceA
{
private IServiceB serviceB;
public ServiceA(IServiceB serviceB)
{
this.serviceB = serviceB;
}
public string MethodA1()
{
return "MethodA1() " +serviceB.MethodB1();
}
}
或者Unity支持属性注入,因为您需要一个属性和DependencyAttribute
:
public class ServiceA : IServiceA
{
[Dependency]
public IServiceB ServiceB { get; set; };
public string MethodA1()
{
return "MethodA1() " +serviceB.MethodB1();
}
}
MSDN站点是Unity的良好起点。如果您可以在构造函数和属性注入之间进行选择,我认为您应该选择构造函数注入。属性注入将使类依赖于unity或其他调用方“记住”它们需要提供该依赖关系。构造函数注入向任何试图使用该类的人清楚地表明,依赖关系对于该类来说是必不可少的。如果该类有多个依赖关系,那么在某些调用中并不需要这些依赖关系?它们都将被实例化吗?或者它们只在被访问时才会被实例化,如上面所述:serviceB.method()@Carlos@Legends创建ServiceA时,您的所有依赖项都将被安装和注入,即使您没有在所有方法中使用它们。Unity不支持开箱即用的惰性实例化,但可以将其添加为扩展:我尝试了以下操作:
container.RegisterType()代码>container.RegisterType(新的InjectionProperty(“CDA”,container.Resolve())代码>我已将驻留在SampleBF中的属性CDA标记为依赖项。我的问题是,如果我手动实例化SampleBF,它会工作吗?因为我就是这样做的,在尝试访问属性CDA时,我总是得到“对象引用未设置为实例”。好的,我还必须通过unity解析调用类(在我的例子中是SampleBF),然后它才能工作。