ASP.NET MVC项目EF存储库模式

Dom*_*000 6 c# asp.net-mvc dependency-injection

如果我在ASP.NET MVC应用程序中使用存储库模式,我需要DI让程序知道,必须映射类的接口.如果我实现Unity,我需要将DAL项目添加到我的MVC项目,然后在global.asax中注册类型.

在我看来,我认为将DAL层的命名空间添加到MVC项目是不好的,中间还有一个业务层.我认为,在业务层中注入DAL类并在MVC应用程序中仅注入业务层映射会很美妙.

怎么去这里?你有什么建议吗?

更新:向我说清楚.在服务层中,只有DTO和业务和数据访问层的DI.在服务层中,我将DTO映射到域模型.我不明白的是,我怎样才能调用业务层方法呢?

dbl*_*ood 3

即使您不使用不同的服务层,您也可以完成您想要的任务,即使用 DI 将 MVC 应用程序与 DAL 项目解耦。

执行此操作的方法是在其中添加几个项目/程序集,将 IoC 容器与您定义的接口的特定实例连接起来。

我通常使用以下命名约定:

  • 我的公司.我的项目.基础设施

  • 我的公司.我的项目.摘要

然后,您的主 MVC 项目将引用您的抽象和基础设施项目。您的基础设施项目将引用抽象和特定于实例的项目,例如业务和 DAL 项目。在基础设施项目中,您连接依赖项。

您必须为 MVC 项目设置一种机制,以在基础设施程序集中引导 IoC。您可以在 global.asax 中或作为 App_Start 方法执行此操作,并在基础结构程序集中调用注册类。

我们使用 StructureMap,但概念是相同的。这是一些示例代码。

在您的 MVC 应用程序中,创建一个 App_Start 方法来设置 DI。

public static class StructuremapMvc
{
    public static void Start()
    {

        // Create new Structuremap Controller factory so Structure map can resolve the parameter dependencies.
        ControllerBuilder.Current.SetControllerFactory(new StructuremapControllerFactory());

        IContainer container = IoC.Initialize();

        DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));

        GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的基础结构程序集中,连接依赖项。

public static class IoC
{
    public static IContainer Initialize()
    {
        ObjectFactory.Initialize(x =>
                    {
                        x.Scan(scan =>
                                {
                                    scan.TheCallingAssembly();
                                    scan.WithDefaultConventions();
                                });
                        x.For<IRepositoryNum1>().Use<Num1Repository>();
                        x.For<IRepositoryNum2>().Use<Num2Repository>();
                        x.For<IRepositoryNum3>().Use<Num3Repository>();
                    });

        return ObjectFactory.Container;
    }
}
Run Code Online (Sandbox Code Playgroud)