首页 文章

用于多个应用程序的ASP.NET Core中的自动配置和依赖注入

提问于
浏览
0

请原谅我这个冗长的解释,这要提到我问题的所有细节 .

我正在使用.NET Core,想知道AutoMapper配置的最佳位置在哪里?我应该从哪里打电话?什么是向几个ASP.NET核心应用程序注入公共服务的最佳方法 .

现在是这种情况,我有以下几点:

  • Angular2应用程序(客户端)

  • Resources API(用于API的ASP.NET核心APP)

  • 身份验证API(用于API的ASP.NET核心应用程序)

  • 服务层(类库)

  • 存储库层(类库)

  • 核心(类库)

在存储库层,我有我的实体框架类(EntityModels文件夹),我有我的存储库实现,我使用EF来获取数据 . 映射是在这个级别发生的:

public User Get(int id)
    {
        using (var securityDb = new SecurityContext())
        {
           var record = securityDb.Users.Where(u => u.UserId == id).SingleOrDefault();

           return AutoMapper.Mapper.Map<User>(record);
        }
    }

在Core项目中,我有我的域和dto类,它们从Repository层返回到服务层 .

Services和Repositories项目都引用了Core Class库 .

现在,我应该注册所有依赖项,这是Authentication API项目中的“ConfigureServices”启动方法,我通过调用Mapping类方法来配置AutoMapper .

services.AddTransient<SecurityCore.RepositoryContracts.IUserRepository, SecurityCore.Repositories.UserRepository>();
 services.AddTransient<SecurityCore.ServiceContracts.IUserService, SecurityCore.Services.UserService>();

//Automapper configuration
  SecurityCore.Repositories.EntityModels.Mappings.Configure();

我在存储库项目中有映射类,如上图所示:

public class Mappings
{
    public static void Configure()
    {
        AutoMapper.Mapper.Initialize(cm => cm.CreateMap<EntityModels.Users, Models.User>());
    }
}

这是我的一些问题:

  • 我是否应该创建一个引导所有映射配置的单独项目,但这意味着该项目应引用Core和Repositories项目(而不是在存储库中具有映射配置)

  • 应该像我的情况一样在ASP.NET Core上进行自动化配置吗?

  • 如何注入在两个ASP.NET Core项目中重复的依赖项代码,我如何分离引导过程?应该在每个应用程序中调用一次吗?

1 回答

  • 1

    我不能说我是一名架构专家,我不确定最佳实践是关于我们的项目在“.NET核心时代”应该是多么精细 .

    但是,here is a sample project我正在将实现AutoMapper和Autofac的现有代码移植到新的ASP.NET Core MVC解决方案 .

    我的示例代码将AutoMapper映射接口放置在包含域模型的业务逻辑层(BLL)库中 . 这些接口的实现以及配置(AutoMapper Profiles)位于数据访问层(DAL)的单独项目中 . 这种布置有助于在不接触BLL的情况下交换映射引擎 .

    配置在AutoMapper初始化期间执行,在ASP.NET Core解决方案中通过Startup.ConfigureServices()调用 .

    Please watch this post和我的AutoMapper和Autofac实现更新示例代码 .

    我假设您将存储库接口与模型放在同一个BLL库中,并在DAL中实现这些存储库接口 . 这就是我所理解的“最佳实践”,它将使您能够在不触及BLL的情况下更改对象关系映射器(ORM) .

    我建议您对代码进行以下更改:

    • 重构映射逻辑从您的存储库到DAL中的单独项目(单一责任主体)

    • 为从AutoMapper.Profile派生的类中的每个域模型配置映射

    • 在服务类中执行域模型和数据传输对象(DTO)之间的映射
      通过启动项目

    • 初始化并配置一次AutoMapper

    至于依赖注入(DI):

    • DI容器通过启动项目实例化一次

    • 服务通过类构造函数注入

    关于DI的以下文章值得回顾:

    • docs.asp.net/en/latest/fundamentals/dependency-injection.html

    • wildermuth.com/2016/08/07/ASP-NET-Core-Dependency-Injection

    • docs.autofac.org/en/latest/integration/aspnetcore.html

相关问题