我的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的信息(因为这不是问题的焦点)
答案 0 :(得分:2)
我已经读过服务定位器是反模式
也许不是100%,但他们应该气馁。 Mark Seemann解释了Service Locator is an Anti-Pattern。
我认为你应该关注Dependency Injection。
您遇到的问题是静态方法本身就难以解决依赖性问题。
我建议您考虑从应用程序的其他地方实现非静态方法和依赖项注入。正如 Alexei 指出的那样,从查看调用内容并不理想。