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

C# ASP.NET MVC项目EF存储库模式,c#,asp.net-mvc,dependency-injection,C#,Asp.net Mvc,Dependency Injection,如果我在ASP.NET MVC应用程序中使用Repository模式,我需要DI让程序知道,为了接口,必须映射类。如果我实现Unity,我需要将DAL项目添加到我的MVC项目中,然后在global.asax中注册这些类型 在我看来,我认为将DAL层的名称空间添加到MVC项目中是不好的,在这两者之间还有一个业务层。我认为,在业务层中注入DAL类,而在MVC应用程序中只注入业务层映射,这将是一件美妙的事情 这里怎么走?你有什么建议吗 更新: 让我明白。在服务层中,业务和数据访问层只有DTO和DI。在

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

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

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

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

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


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

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

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

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

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

  • MyCompany.MyProject.Infrastructure

  • MyCompany.MyProject.Abstract

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

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;
    }
}
您必须为您的MVC项目设置一种机制,以便在基础架构程序集中引导IoC。您可以在global.asax或App_Start方法中执行此操作,并在基础结构程序集中调用注册类

我们使用StructureMap,但概念是一样的。下面是一些示例代码

在MVC应用程序中,创建应用程序启动方法以设置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;
    }
}
公共静态类IoC
{
公共静态IContainer初始化()
{
ObjectFactory.Initialize(x=>
{
x、 扫描(扫描=>
{
扫描。卡入总成();
scan.WithDefaultConventions();
});
x、 For().Use();
x、 For().Use();
x、 For().Use();
});
返回ObjectFactory.Container;
}
}

使用回购并不意味着你必须使用DI——它们解决了两个不同的问题。我建议你阅读“洋葱架构”,我认为这是一个很好的项目参考方法。因为您的UI和DataAccess层都位于外部,所以它们相互引用应该不会有任何问题。好的,这个基础结构就像Alwyn描述的服务层,但是没有DTO,对吗?这种方法在我看来非常好,我将对其进行测试。是的,这种方法可以在有或没有服务层和相关DTO的情况下使用。好的,我将测试这两种方法。我会看看什么更适合我。