静态方法和服务定位器

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 4 Dependency Injection