如何使用Unity解决嵌套依赖项?

时间:2015-01-18 16:55:45

标签: c# dependency-injection

如何配置我的Unity容器以便解析依赖对象的树? 假设我们有这样的类:

    public class Foo : IFoo
    {
        [Dependency]
        public IBar Bar { get; set; }
    }

    public class Bar : IBar
    {
        [Dependency]
        public IRepository Repository { get; set; }
    }

    public class Repository : IRepository
    {
        [Dependency]
        public IService Service { get; set; }
    }

我希望解决Foo:      Container.ResolveAll();

是否可以解析无限制的嵌套依赖对象?

1 个答案:

答案 0 :(得分:3)

构建依赖关系树(依赖关系图)是为哪些DI库构建的。

最佳做法是使用构造函数注入而不是属性注入。这也使您不必让您的课程了解您的DI库。

所以第一步是重构构造函数注入,如下所示:

public class Foo : IFoo
{
    private readonly IBar bar;
    public Foo (IBar bar) {
        this.bar = bar;
    }
}

public class Bar : IBar
{
    private readonly IRepository repository;        
    public Bar(IRepository repository) {
        this.repository = repository;
    }
}

public class Repository : IRepository
{
    private readonly IService service;        
    public Repository(IService service) {
        this.service = service;
    }
}

第二步是配置容器:

var container = new UnityContainer();

container.RegisterType<IFoo, Foo>();
container.RegisterType<IBar, Bar>();
container.RegisterType<IRepository, Repository>();
container.RegisterType<IService, Service>();

第三步是解决IFoo

IFoo foo = container.Resolve<IFoo>();

现在Unity将为您解析整个对象图。