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),然后它才能工作。