静态方法和服务定位器

时间:2015-07-19 22:46:24

标签: asp.net-mvc asp.net-mvc-4 dependency-injection inversion-of-control 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的信息(因为这不是问题的焦点)

1 个答案:

答案 0 :(得分:2)

  

我已经读过服务定位器是反模式

也许不是100%,但他们应该气馁。 Mark Seemann解释了Service Locator is an Anti-Pattern

我认为你应该关注Dependency Injection

您遇到的问题是静态方法本身就难以解决依赖性问题。

我建议您考虑从应用程序的其他地方实现非静态方法和依赖项注入。正如 Alexei 指出的那样,从查看调用内容并不理想。

ASP.NET MVC 4 Dependency Injection