【问题标题】:Calling a factory to return a type with Unity IoC使用 Unity IoC 调用工厂返回类型
【发布时间】:2014-05-08 13:05:40
【问题描述】:

我有一家工厂:

public class FooFactory : IFooFactory
{
    public IFoo CreateFoo(IBar bar)
    {
        return new Foo(bar);
    }
}

我的 Unity 容器需要解析 Foo

var container = new UnityContainer();

container.RegisterType<IBar, Bar>();
conatiner.RegisterType<IFooFactory,FooFactory>(
    new InjectionConstructor(new ResolvedParameter<IBar>())
container.RegisterType<IFoo, Foo>(????????);  //What should be here?

我如何告诉 Unity 调用 Factory 上的方法以获得IFoo

【问题讨论】:

  • 如果您不打算使用 FooFactory 来生成新的 Foo,那么有什么意义?
  • @matt 工厂在不同的程序集中,在“现实生活”中它构造了一个复杂的Foo,以便父程序集中的容器与消耗的程序集解耦;目前,parant 程序集必须构建完整的Foo,因此了解Foo 内部的所有私密细节。
  • 这就是为什么我不喜欢在示例代码中使用FooBar ;) 很难确定你的代码试图做什么。除了组装和链接问题,您还有一个类,其目的是生成 IFoo 的实例 - 这就是您应该使用它来获取 IFoo
  • @matt 实际上,我同意你 w.r.t Foo & Bar 的观点。我试图将其概括化。

标签: c# dependency-injection inversion-of-control unity-container ioc-container


【解决方案1】:

我认为你试图过度设计这个 - 你有一个类 (FooFactory):

  • 当给定IBar 实例时,
  • 返回一个IFoo 实例

使用工厂生成您的IFoo 实例:

public class Greeter
{
  private readonly IFooFactory _fooFactory;

  public Greeter(IFooFactory fooFactory)
  {
    _fooFactory = fooFactory;
  }

  public string SayHelloWithABar(IBar bar)
  {
    IFoo foo = _fooFactory.CreateFoo(bar);

    // do something with your 'foo' instance ...

    return "hello!";
  }
}

【讨论】:

  • 是的,但我希望 Unity 调用该方法。我可以那样做,让 Unity 为我做这件事感觉更“正确”。
【解决方案2】:

您可以使用InjectionFactory 来完成。不过,我建议您切换到使用 IFooFactory 作为 Bar 中的依赖项。它使代码更容易理解。

更好:

public class Bar
{
    private IFoo _foo;

    public Bar(IFooFactory fooFactory)
    {
        _foo = fooFactory.Create(this);
    }
}

【讨论】:

  • 干杯,“IFooFactory 作为 'Bar' 中的依赖项”是什么意思?
  • 构造函数注入,就像我添加的示例一样。
  • 一般来说,您应该避免在服务的构造函数中做任何“有用”的事情(除了存储传入的依赖项之外的任何事情)。这个例子看起来很奇怪,因为工厂主要是为了延迟对象图的构建,但在这种情况下你不会延迟构建,因为你在构造函数中调用了工厂。这种情况下,为什么不直接将IFoo注入构造函数呢?
猜你喜欢
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多