【发布时间】:2015-10-08 23:58:30
【问题描述】:
我的 ASP.NET MVC 应用程序中有一个静态辅助方法。这是一些演示该问题的示例代码(实际代码有点复杂)。请专注于模式。实际代码不与数据库交互。
下面的代码被抽象为允许单元测试。我遇到的问题是获得 IDatabaseManager 的具体实现。使用服务定位器不好吗?有什么好的做法推荐吗?我读过服务定位器是反模式。请指教。代码中的所有其他地方都在使用依赖注入(这里的问题显然是静态 DataWriter 方法)。
public static class DataWriter {
public static void WriteDate() {
var datetime = DateTime.Now.ToString();
//Is this service locator a bad pattern?
var databaseManager = StructureMap.ObjectFactory.Container.GetInstance<IDatabaseManager>();
var dataRepository = new DataRepository(databaseManager);
dataRepository.Write(datetime);
}
}
public class DatabaseManager : IDatabaseManager {
public void Write(string s) {
//Write to database
}
//Other methods
...
...
}
public interface IDatabaseManager {
void Write(string s);
//Other signatures
...
...
}
public class DataRepository : IDataRepository {
private IDatabaseManager _databaseManager;
public DataRepository(IDatabaseManager databaseManager) {
_databaseManager = databaseManager;
}
public void Write(string data) {
_databaseManager.Write(data);
}
}
public interface IDataRepository {
void Write(string data);
}
根据 Alex 的建议进行编辑。 再次编辑以删除有关 cshtml 的信息(因为这不是问题的重点)
【问题讨论】:
-
Writing 从 CSHTML 到数据库非常有争议,我不会担心除此之外使用服务定位器。旁注:您可能想重申您的问题(也许您的意思是“我应该使用服务定位器”,因为显然您的示例确实使用了它)。
-
问题不在于写入数据库。实际代码不编写数据库或与数据库交互。这是演示该问题的伪代码。同样,我的问题是我正在使用服务定位器,但我应该首先使用它。我正在寻求有关为什么这不好的建议。
标签: asp.net-mvc asp.net-mvc-4 dependency-injection inversion-of-control service-locator