Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 多个项目中的asp.net 5依赖项注入_Dependency Injection_Asp.net Core_Repository Pattern_Autofac_Separation Of Concerns - Fatal编程技术网

Dependency injection 多个项目中的asp.net 5依赖项注入

Dependency injection 多个项目中的asp.net 5依赖项注入,dependency-injection,asp.net-core,repository-pattern,autofac,separation-of-concerns,Dependency Injection,Asp.net Core,Repository Pattern,Autofac,Separation Of Concerns,我有一个ASP.NET 5 dnxcore解决方案,其中包含一些项目来分离我的逻辑: 原料药 核心(带有用于业务逻辑的服务) DAL(存储库接口) 实体框架(存储库实现) 现在,我使用DI在API控制器的构造函数中调用我的服务: private readonly IMyService _myService; public Controller(IMyService myservice){ _myService = myService; } my core中的服务也通过构造函数注入获得存储库

我有一个ASP.NET 5 dnxcore解决方案,其中包含一些项目来分离我的逻辑:

  • 原料药
  • 核心(带有用于业务逻辑的服务)
  • DAL(存储库接口)
  • 实体框架(存储库实现)
现在,我使用DI在API控制器的构造函数中调用我的服务:

private readonly IMyService _myService;
public Controller(IMyService myservice){ _myService = myService; }
my core中的服务也通过构造函数注入获得存储库:

private readonly IMyRepository _myRepo;
public MyService(IMyRepository myRepo){ _myRepo = myRepo; }
目前,我需要在API的startup类中定义DI容器以使其正常工作

我的问题是,如何将存储库的DI容器的“构建”放在核心项目的服务中。这样,我的API与我的服务使用实体框架这一事实松散耦合,因此我可以在不更改API项目的情况下更改为mongodb

我的问题是,如何将存储库的DI容器的“构建”放在核心项目的服务中。这样,我的API与我的服务使用实体框架这一事实松散耦合,因此我可以在不更改API项目的情况下更改为mongodb

你可以,但你不应该那样做

依赖注入是在整个库中创建松散耦合类的实践,这些类可以插在一起(通常以多种方式)

但是,每个应用程序都应该有一个,这是应用程序中放置耦合代码的地方。作为开发人员,我们的第一反应是尝试将耦合代码分包到自己的库中,但这是您应该抵制的冲动。看

总结得很好。当使用DI以展平依赖关系图时,需要避免可传递依赖关系。这确保了程序集可以单独使用/测试,而无需拖拽不必要的依赖项,从而使维护更加容易


也就是说,许多DI容器都可以通过使用模块来组织应用程序某些部分的配置。在Autofac中,.

的文档,您可以轻松地将IServiceCollection的扩展方法添加到服务层中,并使用它注册自己的依赖项。 然后在启动时,您只需在服务层调用该方法,而不必在web应用程序中引用EntityFramework

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

namespace your.service.layer
{
    public static class MyServiceCollectionExtensions
    {
        public static IServiceCollection AddMyServiceDependencies(this IServiceCollection services)
        {
            services.AddScoped<My.Data.Tier.DbContext, My.Data.Tier.DbContext>();
        }
    }

}

现在,您的web应用程序只需要引用您的服务层,而不直接依赖EntityFramework。

,我也有同样的问题,因为我的应用程序不依赖数据库,并且基于请求需要在面向文档的数据库(noSQL)和事务数据库(SQL)之间切换

正如NightOwl888所说,您的应用程序中应该有一个CompositionRoot,即设置所有依赖项的位置。 我所做的是: 1.创建名为CompositionRoot的核心类库。 2.添加一个类来处理依赖项:

public class DependencyMapper
{
    public static void SetDependencies(IServiceCollection serviceCollection, IConfigurationRoot configuration)
    {
        serviceCollection.AddEntityFramework()
                         .AddDbContext<SonoPeopleContext>(options =>
                                                        options.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"])
                                                        );            

        MapperConfiguration mapperConfiguration = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile(new AutoMapperProfileConfiguration());
        });
        serviceCollection.AddSingleton<IMapper>(sp => mapperConfiguration.CreateMapper());

        serviceCollection.AddScoped<IUserService, UserService>();

    }
}

仅此而已。

这是最佳做法吗?请参阅。使用这种方法,您最终会遇到与以前相同的问题:您的Web项目将引用您的.service.layer,而您的.service.layer将引用特定的实现,通过传递性,您的Web项目将引用您的.service.layer。是的,将存在传递依赖关系。我自己把我的大部分代码放在类库项目中,所以对我来说,主web应用程序/控制台应用程序只是连接依赖项和配置的组合根。我不认为这是个问题。你有新的aspnet 5依赖注入的例子吗?谢谢
public class DependencyMapper
{
    public static void SetDependencies(IServiceCollection serviceCollection, IConfigurationRoot configuration)
    {
        serviceCollection.AddEntityFramework()
                         .AddDbContext<SonoPeopleContext>(options =>
                                                        options.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"])
                                                        );            

        MapperConfiguration mapperConfiguration = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile(new AutoMapperProfileConfiguration());
        });
        serviceCollection.AddSingleton<IMapper>(sp => mapperConfiguration.CreateMapper());

        serviceCollection.AddScoped<IUserService, UserService>();

    }
}
DependencyMapper.SetDependencies(services, Configuration);