如何从UI /服务层抽象我的DI工具

时间:2013-08-01 07:19:51

标签: c# asp.net-mvc oop design-patterns

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

截至目前,我在我的服务层中有类似的东西,它与MVC应用程序中的UI进行对话。

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

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

1 个答案:

答案 0 :(得分:2)

  

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

那不是真的。如前一个主题所示,服务层对DI框架一无所知。

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

因此,您绝对应该从您的服务中删除kernel.Get<>来电。目前您正在使用服务定位器而不是依赖注入。服务定位器是一种反模式。您的服务层应如下所示:

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
    }
}