我有很多核心类,它们需要数据库的ISessionContext,用于日志的ILogManager和用于与其他服务进行通信的IService。我想对所有核心类使用的此类使用依赖项注入。
我有两个可能的实现。接受所有三个类的IAmbientContext或为所有三个类注入IAmbientContext的核心类。
public interface ISessionContext
{
...
}
public class MySessionContext: ISessionContext
{
...
}
public interface ILogManager
{
}
public class MyLogManager: ILogManager
{
...
}
public interface IService
{
...
}
public class MyService: IService
{
...
}
第一个解决方案:
public class AmbientContext
{
private ISessionContext sessionContext;
private ILogManager logManager;
private IService service;
public AmbientContext(ISessionContext sessionContext, ILogManager logManager, IService service)
{
this.sessionContext = sessionContext;
this.logManager = logManager;
this.service = service;
}
}
public class MyCoreClass(AmbientContext ambientContext)
{
...
}
第二种解决方案(无环境上下文)
public MyCoreClass(ISessionContext sessionContext, ILogManager logManager, IService service)
{
...
}
在这种情况下,维奇是最好的解决方案?
IService
用于与其他服务进行通信”?如果IService
表示对其他服务的模糊依赖,那么这听起来像是服务定位符,并且不应该存在。您的类应依赖于明确描述其使用者将如何使用它们的接口。任何班级都不需要服务来提供对服务的访问。类需要一个依赖项,该依赖项可以执行该类需要的特定操作。