1

这个问题是我上周末发布的这个问题的后续。

到目前为止,我的服务层中有这样的东西,它与 MVC 应用程序中的 UI 对话。

IDepartmentService deptService = kernel.Get<IDepartmentService>();
IList<Department> deptList = deptService.GetAllDepartments();

一切都很好,DI 正在按预期工作。但是,由于某种原因,如果我决定使用 Structuremap,那么我的整个服务层都需要更改。我如何将其抽象出来,以便 DI 工具的更改不会影响我的服务层或影响最小。

4

1 回答 1

2

但是,由于某种原因,如果我决定使用 Structuremap,那么我的整个服务层都需要更改。

这不是真的。如上一个线程所示,服务层对 DI 框架一无所知。

您应该有一个名为composition root. 这是唯一了解 DI 框架和所有底层的层。这是你在做作文的地方。因此,如果您更改 DI 框架,您唯一需要进行更改的地方就是组合根。

因此,您绝对应该摆脱kernel.Get<>来自您的服务的呼叫。现在您使用的是Service Locator而不是Dependency Injection。服务定位器是一种反模式。您的服务层应如下所示:

public class MyService
{
    private readonly ISomeDependency dependency;
    public MyService(ISomeDependency dependency)
    {
        this.dependency = dependency;
    }

    public void SomeMethod()
    {
        // do something with the dependency here
    }
}

代替:

public class MyService
{
    private readonly ISomeDependency dependency;
    public MyService()
    {
        this.dependency = kernel.Get<ISomeDependency>();
    }

    public void SomeMethod()
    {
        // do something with the dependency here
    }
}
于 2013-08-01T07:33:18.280 回答