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

本文关键字:存储 模式 EF 项目 NET MVC ASP | 更新日期: 2023-09-27 18:07:17

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

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

到这里怎么走?你有什么建议吗?

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

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

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

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

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

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

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

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

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

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

您必须为MVC项目设置一个机制,以便在基础结构程序集中引导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;
    }
}

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