【发布时间】:2018-02-28 16:49:10
【问题描述】:
我有一个可能需要或不需要服务的类,之前通过依赖注入注册,具体取决于用户需要。
他通过静态方法GetInstance(bool) 实例化我的类,如果bool 设置为true,那么我需要调用基于依赖注入的构造函数。如何做到这一点?
public class MyClass {
private MyClass() {
// ...
}
private MyClass(MyService env) {
// ...
}
public static MyClass GetInstance(bool serviceIsNeeded) {
if (serviceIsNeeded) {
/* How to realize the following ?
* if (!ServiceRegistered<MyService>())
* throw new ServiceNotFoundException(...);
* return InstanciateWithDependencyInjection(typeof(MyClass));
*/
}
else
return new MyClass();
}
}
例如,在 Java 中,您将 @Inject 标记放在构造函数的顶部,然后像这样实例化您的类:MyClass myClass = getInjector(getContext()).getInstance(MyClass.class)
我正在 C# 和 ASP.NET Core 2 中寻找相同的概念。
【问题讨论】:
-
这是一种反模式。不要这样做。如果该类需要依赖项,则注入它。如果依赖关系是相对的,那么您可能需要重构代码以使其不是(可能是基类?)。注入依赖项也不应该有开销(反正不多)。为什么注入依赖项而不使用它会有什么不同?这似乎是一种“代码气味”?实例化
MyService是做什么的? -
@Liam 到时候我会尝试重构它,但不管怎样,即使
GetInstance中没有条件,如何实例化需要DI 的类? -
你不应该在你的堆栈中一直使用 DI。框架(简单的注入器,无论你使用的是什么,等等)应该实例化底层类并解决所有依赖关系。这就是您保持松散耦合的方式。一旦你开始使用服务定位器(这几乎就是你在这里谈论的内容)解决依赖关系,你就会引入一个紧密耦合的组件。
-
@Liam 我正在测试该方法,我刚刚发现了 Mocks,所以现在一切都很好,如果你愿意,你可以添加一个总结作为答案,我会接受它,它引导我好办法
标签: c# asp.net-core dependency-injection