C# .NET Core 2.0模块依赖项注入

C# .NET Core 2.0模块依赖项注入,c#,entity-framework,dependency-injection,.net-core,C#,Entity Framework,Dependency Injection,.net Core,我正在尝试构建一个库,它有核心和扩展包,比如EntityFramework及其数据库提供程序 我想做的是,当我用依赖注入注册这个库时,我想把具体的实现作为一个参数 想想EF。为了在EF上使用sql provider,我们需要将其注册为作为选项参数传递的sql provider,如下所示 services.AddDbContext<ApplicationDbContext>(options => { options.UseSqlServer(Configuration["C

我正在尝试构建一个库,它有核心和扩展包,比如EntityFramework及其数据库提供程序

我想做的是,当我用依赖注入注册这个库时,我想把具体的实现作为一个参数

想想EF。为了在EF上使用sql provider,我们需要将其注册为作为选项参数传递的sql provider,如下所示

services.AddDbContext<ApplicationDbContext>(options =>
{
   options.UseSqlServer(Configuration["ConnectionString"]);
});
我甚至找不到一个能为我指明方向的关键词。我试图阅读实体框架的源代码,但对于我的案例来说太复杂了

有人能给我指个方向吗


提前感谢。

我不确定是否完全理解您的需求,但DI和扩展在.net core中是一件容易的事情

假设您希望在Startup.cs中使用此功能

services.AddFilmProducer(options =>
{
   options.UseHollywoodProducer();
});
services.AddFilmProducer(options =>
{
   options.UseHollywoodProducer();
});
要实现这一点,请创建库并添加静态扩展类

public static class FilmProducerServiceExtensions
{
    public static IServiceCollection AddFilmProducer(this IServiceCollection services, Action<ProducerOptions> options)
    {
        // Create your delegate
        var producerOptions = new ProducerOptions();
        options(producerOptions);

        // Do additional service initialization
        return services;
    }
}
如果您希望在服务中使用传递的ProducerOptions,有两种方法。再次使用依赖项注入,或者在扩展方法中使用服务提供者直接访问服务

var serviceProvider = services.BuildServiceProvider()
IYourService service = sp.GetService<IYourService>();
在扩展方法中,并通过

public YourService(IOptions<ProducerOptions>)
您的服务扩展现在变为

public static class FilmProducerServiceExtensions
{
    public static IServiceCollection AddFilmProducer(this IServiceCollection services, Action<IProducerOptions> options)
    {
        // Do additional service initialization
        return services;
    }
}
创建任意数量的包和IProducerOptions扩展,添加的方法将开始出现在Startup.cs中

services.AddFilmProducer(options =>
{
   options.UseHollywoodProducer();
});
services.AddFilmProducer(options =>
{
   options.UseHollywoodProducer();
});

我不确定我是否完全理解您的需求,但DI和扩展在.NETCore中是一件容易的事情

假设您希望在Startup.cs中使用此功能

services.AddFilmProducer(options =>
{
   options.UseHollywoodProducer();
});
services.AddFilmProducer(options =>
{
   options.UseHollywoodProducer();
});
要实现这一点,请创建库并添加静态扩展类

public static class FilmProducerServiceExtensions
{
    public static IServiceCollection AddFilmProducer(this IServiceCollection services, Action<ProducerOptions> options)
    {
        // Create your delegate
        var producerOptions = new ProducerOptions();
        options(producerOptions);

        // Do additional service initialization
        return services;
    }
}
如果您希望在服务中使用传递的ProducerOptions,有两种方法。再次使用依赖项注入,或者在扩展方法中使用服务提供者直接访问服务

var serviceProvider = services.BuildServiceProvider()
IYourService service = sp.GetService<IYourService>();
在扩展方法中,并通过

public YourService(IOptions<ProducerOptions>)
您的服务扩展现在变为

public static class FilmProducerServiceExtensions
{
    public static IServiceCollection AddFilmProducer(this IServiceCollection services, Action<IProducerOptions> options)
    {
        // Do additional service initialization
        return services;
    }
}
创建任意数量的包和IProducerOptions扩展,添加的方法将开始出现在Startup.cs中

services.AddFilmProducer(options =>
{
   options.UseHollywoodProducer();
});
services.AddFilmProducer(options =>
{
   options.UseHollywoodProducer();
});

您必须在包中创建自己的扩展方法,以允许实现这一点,而这正是我试图实现的目标。我不能用我自己的扩展方法构建这个结构,这就是为什么我要问这个问题。有什么款式能满足我的要求吗?这有一个关键词吗?展示你是如何构建它的。你展示了你想要它看起来像什么,但不是你尝试过的。实际上,我没有任何有意义的数据/代码与你分享。我被卡住了。但我保证,如果我找到了一种方法,我会与大家分享。你必须在软件包中创建自己的扩展方法,这样才能实现这一点,而这正是我在努力实现的目标。我不能用我自己的扩展方法构建这个结构,这就是为什么我要问这个问题。有什么款式能满足我的要求吗?这有一个关键词吗?展示你是如何构建它的。你展示了你想要它看起来像什么,但不是你尝试过的。实际上,我没有任何有意义的数据/代码与你分享。我被卡住了。但我保证,如果我找到了一个方法,我会和大家分享。这是一个很好的尝试。干得好
UseHollywoodProducer
和其他代码也是options类上的扩展方法。其中options类可以公开一个
Use(PropducerType p)
,扩展方法将使用必要的值调用它。感谢详细的解释和示例代码。但我认为我们的产品对好莱坞和宝莱坞包装都产生了依赖。我认为我应该在核心包上找到更抽象的方法来生成选项,然后在实现包上编写实现类。若我将ProducerOptions更改为interface或abstract类,这意味着我将无法在AddFilmProducer扩展方法上创建新的ProducerOptions实例。您认为还有其他方法可以将实现类解耦到扩展包吗?这是一个很好的尝试。干得好
UseHollywoodProducer
和其他代码也是options类上的扩展方法。其中options类可以公开一个
Use(PropducerType p)
,扩展方法将使用必要的值调用它。感谢详细的解释和示例代码。但我认为我们的产品对好莱坞和宝莱坞包装都产生了依赖。我认为我应该在核心包上找到更抽象的方法来生成选项,然后在实现包上编写实现类。若我将ProducerOptions更改为interface或abstract类,这意味着我将无法在AddFilmProducer扩展方法上创建新的ProducerOptions实例。您认为还有其他方法可以将实现类与扩展包解耦吗?