【问题标题】:Static methods and the service locator静态方法和服务定位器
【发布时间】: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


【解决方案1】:

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

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

我认为你应该关注Dependency Injection

您面临的问题是静态方法本身就很难解决依赖关系。

我建议您考虑从应用程序的其他地方实现非静态方法和依赖注入。正如 Alexei 所指出的,从 View 调用事物并不理想。

ASP.NET MVC 4 Dependency Injection

【讨论】:

  • 感谢您的回复。看来这是关键。我应该避免使用静态方法并使用其他地方的依赖注入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 2017-12-08
  • 2012-03-01
  • 1970-01-01
  • 2019-06-29
相关资源
最近更新 更多