使用工厂获取注入对象

6

是否有一个工厂方法来检索注入的对象是良好的实践,还是仅使用DI框架的工厂方法就可以了呢?

我正在使用Structure Map,我应该只使用ObjectFactory.GetInstance();,还是应该创建工厂类,在这个类内部调用ObjectFactory.GetInstance();?因为如果我在我的类中调用ObjectFactory.GetInstance(); 我会对DI框架产生耦合。如果我对这些概念不了解,请原谅,我是新手。谢谢!

2个回答

3

当您需要对实例的创建时间进行精细控制时,工厂方法非常有用。但是,您不应直接依赖于容器本身,而是将工厂方法注入为依赖项。以下是说明此概念的示例:

public class SomeController
{
    private Func<ISomeService> _serviceFactory;
    public SomeController(Func<ISomeService> serviceFactory)
    {
         _serviceFactory = serviceFactory;
    }

    public void DoSomeWork()
    {
       var service = _serviceFactory();
       ....
    }
}

StructureMap注册代码应该类似于这样:
var container = new Container(cfg =>
    cfg.For<ISomeService>().Use(() => new SomeServiceImpl())
);

3
如果您已经在使用DI框架,为什么还要重新实现工厂模式,而这个模式已经由框架提供了呢?此外,在应用程序的业务层中不应该与DI框架创建依赖。在那里,您应该使用接口和抽象类进行抽象化。DI框架只应该在最高层次上使用,例如在GUI中执行较低层次的管道操作并选择适当的数据访问层。

1
我同意Darin的观点,让DI框架发挥它的作用,而不是重复功能。 - Jeff Schumacher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接