ASP.NET MVC项目中的EF仓储模式

6
如果我在ASP.NET MVC应用程序中使用仓储模式,我需要使用DI来让程序知道接口映射到哪些类。如果我实现Unity,我需要将DAL项目添加到我的MVC项目中,然后在global.asax中注册这些类型。
在我看来,将DAL层的命名空间添加到MVC项目中是不好的,因为还有一个业务层。我认为,在业务层中注入DAL类并且只在MVC应用程序中映射业务层将是优美的解决方案。
那么该怎么做呢?你有什么建议吗?
更新: 为了让我清楚地理解,服务层中只有DTO和业务和数据访问层的DI。在服务层中,我将DTO映射到域模型。我不明白的是,我如何调用业务层的方法?

使用存储库并不意味着您必须使用 DI - 它们解决两个不同的问题。 - Nick Butler
2
我建议你学习“洋葱架构”,我认为这是一种很好的处理项目引用的方法。因为你的UI层和数据访问层都在外部,所以它们相互引用应该不会有任何问题。 - Charlino
3个回答

4
如果您想要务实,真正的三层架构需要一个服务层。在服务层和MVC之间是数据传输对象(DTO)。服务层隐藏了DAL和业务层。
如果您按照这种方式设置,MVC本身对DAL一无所知,只知道DTO和服务(契约)。

好的,我会测试两种方法。我会看看哪种更适合我。 - Dominik2000

3
即使您不使用独立的服务层,也可以通过 DI 实现所需的解耦 MVC 应用程序和 DAL 项目的目标。方法是添加一对项目/组件在中间,将您定义的接口的特定实例与 IoC 容器绑定。我通常使用以下命名约定:MyCompany.MyProject.Infrastructure 和 MyCompany.MyProject.Abstract。主 MVC 项目应引用抽象和基础设施项目。基础设施项目应引用业务和 DAL 项目等特定实例项目。在基础设施项目中,您需要连接依赖项。您需要在全局.asax 或 App_Start 方法中设置 MVC 项目启动 IoC 的机制,并调用基础设施项目内的注册类。我们使用 StructureMap,但概念相同。以下是一些示例代码。创建一个 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所描述的服务层,但没有DTOs,我说得对吗?这种方法看起来非常不错,我会进行测试。 - Dominik2000
是的,这种方法可以使用服务层和相关的DTO或不使用它们。 - dblood

0

你应该使用 DI 来将领域/数据访问层接口注入到构造函数中。这样做有很多好处,包括在编写单元测试时允许你模拟接口。你可以使用 Autofac 来处理注入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接