【问题标题】:ASP.NET MVC Project EF Repository PatternASP.NET MVC 项目 EF 存储库模式
【发布时间】:2013-04-02 17:35:27
【问题描述】:

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

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

去这里的路是什么?你有什么建议吗?

更新: 让我明白。在服务层,只有 DTO 和业务和数据访问层的 DI。在服务层中,我将 DTO 映射到域模型。我不明白的是,那我怎么调用业务层的方法呢?

【问题讨论】:

  • 使用 repo 并不意味着你必须使用 DI - 它们解决了两个不同的问题。
  • 我建议阅读“洋葱架构”,我认为这是项目参考的好方法。因为你的 UI 和 DataAccess 层都在外面,所以它们相互引用应该没有任何问题。

标签: c# asp.net-mvc dependency-injection


【解决方案1】:

如果你想务实,真正的 3 层架构需要一个服务层。服务和 MVC 之间是数据传输对象 (DTO)。服务层隐藏了 DAL 和业务层。

如果你这样设置,MVC 本身对 DAL 一无所知,只知道 DTO 和服务(合同)。

【讨论】:

  • 好的,我将测试这两种方法。我会看看什么更适合我。
【解决方案2】:

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

这样做的方法是在它们之间添加几个项目/程序集,将您的 IoC 容器与您定义的接口的特定实例连接起来。

我通常使用这个命名约定:

  • MyCompany.MyProject.Infrastructure

  • MyCompany.MyProject.Abstract

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

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

我们使用的是 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);
    }
}

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

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

【讨论】:

  • 好吧,这个基础设施就像 Alwyn 描述的服务层,但是没有 DTO,对吗?这种方法对我来说看起来很不错,我会测试它。
  • 是的,这种方法可以在有或没有服务层和相关 DTO 的情况下使用。
【解决方案3】:

您应该使用 DI 将 Domain/DAL 接口注入到您的构造函数中。这有很多好处,包括允许您在编写单元测试时自定义接口。您可以使用 Autofac 来处理注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2012-06-11
    • 2012-08-25
    • 2013-10-25
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多