问题:
假设班级:
public class MyAwesomeClass { private IDependCls _dependCls; public MyAwesomeClass(IDependCls dependCls) { _dependCls = dependCls; } }
在其他地方我需要获得该类的实例,如下所示:
public class SomewhereElse { public void AwesomeMethod() { //... // AwesomeStuff //... var GetErDone = new MyAwesomeClass(); // PROBLEM! No constructor with 0 arguements } }
问题是,我
建议的解决方案1:
A)必须制作一个额外的构造来解决依赖关系吗?例如:
public MyAwesomeClass() // new constructor { _dependCls = DependencyResolver.Current.GetService<IDependCls>(); } public class SomewhereElse { public void AwesomeMethod() { var GetErDone = new MyAwesomeClass(); // IT WORKS!! } }
提议的解决方案2:
B)在var GetErDone之前使用AwesomeMethod中的解析器
public class SomewhereElse { public void AwesomeMethod() { var depCls = _dependCls = DependencyResolver.Current.GetService<IDependCls>(); var GetErDone = new MyAwesomeClass(depCls); // IT WORKS!! } }
Autofac解决方案?
C)其他一些Autofac方式?
寻找最佳实践,以及尽可能好的Autofac解决方案.我认为第一种方式是最差的,因为可选的依赖性可能会导致很多混乱.
摘要:
当MyAwesomeClass具有依赖关系时,如何获得新的MyAwesomeClass()?
解决方法
看看
Composition Root模式.
你是对的,提升依赖性解决方案只会将问题转移到另一个地方.但是,如果继续在对象图中向上移动,则会到达应用程序的入口点.在那里,您将构成对象图.
将其与Service Locator anti-pattern(在您的情况下使用客户端类中的DependencyResolver)进行比较,您将看到Composition Root是一个出色的解决方案.