我有一些代码看起来像这样:
public MyService(IDependency dependency)
{
_dependency = dependency;
}
public Message Method1()
{
_dependency.DoSomething();
}
public Message Method2()
{
_dependency.DoSomething();
}
public Message Method2()
{
_dependency.DoSomething();
}
现在我刚刚意识到,因为依赖对象包含内部状态信息。我需要在每个方法调用中新建一个新实例
那么,在没有更新具体实例的情况下,最好的方法是什么?
您会使用 IoC 容器并在每个方法中调用该容器吗?或者是否有一种更灵活的方法,您只能对容器进行一次调用?
如果我不使用 IoC 容器怎么办?是否有办法不在每个方法中新建具体实例?
到目前为止,这里的大多数答案都建议您将注入的依赖项类型更改为某种抽象工厂 http://en.wikipedia.org/wiki/Abstract_factory_pattern (a Func<T>
也是一个抽象工厂)来解决这个问题。然而,如果你这样做的话,这将是一个漏洞抽象因为你会让对特定实现的了解决定了设计消费者的。这违反了里氏替换原则 http://en.wikipedia.org/wiki/Liskov_substitution_principle.
更好的选择是保持 MyService 原样,然后为 IDependency 创建一个包装器来解决特定的生命周期问题:
public class TransientDependencyWrapper : IDependency
{
public void DoSomething()
{
new MyStatefulDependency().DoSomething();
}
}
将其注入 MyService,而不是直接注入原始实现 (MyStatefulDependency)。
如果您想抽象出依赖项的创建,您始终可以在此级别注入抽象工厂。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)