静态方法和服务定位器
Static methods and the service locator
我的 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的信息(因为那不是问题的重点)
I have read that service locators are the anti-pattern
也许不是 100%,但应该劝阻他们。 Mark Seemann explains that Service Locator is an Anti-Pattern.
我认为你应该关注 Dependency Injection。
您面临的问题是依赖解析在静态方法中本身就很困难。
我建议您考虑从应用程序的其他地方实施非静态方法和依赖项注入。正如 Alexei 指出的那样,从 View 调用事物并不理想。
我的 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的信息(因为那不是问题的重点)
I have read that service locators are the anti-pattern
也许不是 100%,但应该劝阻他们。 Mark Seemann explains that Service Locator is an Anti-Pattern.
我认为你应该关注 Dependency Injection。
您面临的问题是依赖解析在静态方法中本身就很困难。
我建议您考虑从应用程序的其他地方实施非静态方法和依赖项注入。正如 Alexei 指出的那样,从 View 调用事物并不理想。