【问题标题】:How to use Unity to inject dependencies through factory?如何使用Unity通过工厂注入依赖?
【发布时间】:2014-12-23 09:21:02
【问题描述】:

想象一下我将通过工厂创建一些东西:

public sealed class MyClass
    : IMyClass
{
    private IMyDao MyDao { get; set; }

    public MyClass(IMyDaoFactory factory)
    {
        MyDao = factory.MyDao;
    }
}

这可以通过服务解决:

public sealed class MyService
    : IMyService
{
    private readonly IMyClass myClass;

    public MyService(IMyDaoFactory factory)
    {
        myClass = new MyClass(factory);
    }
}

这很容易在 Unity 中连接为:

var container = new UnityContainer();
container.RegisterType<IMyService, MyService>();
container.RegisterType<IMyDaoFactory, MyDaoFactory>();
container.RegisterType<IMyClass, MyClass>();

注意到 MyClass 的注册,我该如何设置 Unity 使其自动注册并通过工厂解析? IE。那么我不再需要:

myClass = new MyClass(factory);

仅:

this.myClass = myClass; (passed through the constructor 
                         as IMyClass and resolved by Unity)

希望这是有道理的。提前致谢。

【问题讨论】:

  • 出于好奇,考虑到接口暴露行为,为什么需要将接口转换为具体类型?
  • 这是一种避免更深远的重构的尝试。如果我能做到这一点,我可以不理会整个数据层。
  • 内森的回答似乎还可以;只需注册适当的依赖项,Unity 就会为您连接所有内容。例如IMyClass 将 IMyDaoFactory 注入其中。您还需要其他什么东西(可能是对象生命周期)?

标签: c# .net dependency-injection unity-container


【解决方案1】:

尝试将MyService 的构造函数切换为需要IMyClass 的单个实例; Unity 应该自动填补那里的空白并根据类型签名进行实例化。

public MyService(IMyClass _myClass)
{
    myClass = _myClass;
}

虽然我也会改名字,但是嗯。

【讨论】:

  • 我通常使用另一个容器,所以 Unity 让我摸不着头脑,但一旦我解决了问题,我可以(像往常一样)担心从依赖树的顶部开始并从那里向下工作,我是可以了,好了。填补空白。
猜你喜欢
  • 2015-01-01
  • 2011-09-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多