【发布时间】:2015-09-30 09:51:41
【问题描述】:
我目前有一个业务类,其构造函数采用存储库实现。此存储库有多种实现。在运行时,我想决定应该提供哪个存储库实现。我是使用 DI 框架和 Autofac 的新手。这是我的存储库实现。
public interface IRepository
{
string GetData();
}
public class ServiceRepository : IRepository
{
///implementation..
}
public class DatabaseRepository : IRepository
{
///implementation..
}
public class BusinessClass
{
public BusinessClass(IRepository repo)
{
//assign to local variable
}
}
如您所见,IRepository 有多个实现。但是,我想在运行时决定应该将哪一个传递给我的商务舱。我浏览了这些示例here 和here,但它们似乎没有解释如何实现这一要求。在这一点上,改变界面设计不是一种选择。我还需要实现一个工厂类来选择性地解析正确的类型吗?
【问题讨论】:
-
您在应用程序启动时根据配置文件或任何插件系统(如果有的话)注册您想要的实现。如果你需要“即时”改变东西(IMO 有点臭),那么你需要一个工厂。
-
为什么会有点臭?与您所说的不矛盾,而只是试图理解原因。此业务类依赖于数据的外部服务。前端会根据用户的选择向它发送数据源。有时它可能是 webservice-A。有时它可能是 webservice-B,有时它可能是数据库。为这些选择中的每一个复制业务类,以便 Autofac 只有一个类要解决,似乎我们正在润湿现有代码的 DRYness 以适应 DI 框架。不用说,这些服务是我无法控制的。
-
那么你的业务服务应该以工厂为依赖,该工厂将由autofac注入。
标签: oop dependency-injection autofac ooad