.NET Core 2.0模块化dependency injection

我正在尝试构建一个包含Entity Framework及其数据库提供程序等核心和扩展包的库。

我想要做的是当我使用dependency injection注册该库时,我想将特定实现作为参数。

想想EF。 为了在EF上使用sql提供程序,我们需要将其作为选项参数传递给SQL提供程序,如下所示。

services.AddDbContext(options => { options.UseSqlServer(Configuration["ConnectionString"]); }); 

我想建立类似的结构。 让我们说我的框架将提供电影制片人。 它将包含用于框架相关类的producer.core包和两个名为Producer.Extensions.HollywoodProducer.Extensions.Bollywood扩展包。

如果我想使用Hollywood提供商,我需要安装核心包和Hollywood扩展包。 注册时应该看起来像

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

我找不到一个能给我指路的关键词。 我试图阅读entity framework的源代码,但对我的情况来说太复杂了。

有没有人可以指点我的方向?

提前致谢。

我不确定我是否完全理解你的要求,但在.net核心中,DI和扩展是一件容易的事情。

假设您在Startup.cs中想要这个

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

要实现此function,请创建库并添加静态扩展类

 public static class FilmProducerServiceExtensions { public static IServiceCollection AddFilmProducer(this IServiceCollection services, Action options) { // Create your delegate var producerOptions = new ProducerOptions(); options(producerOptions); // Do additional service initialization return services; } } 

您的ProducerOptions实现可能是什么样子

 public class ProducerOptions { public void UseHollywoodProducer() { // Initialize hollywood } public void UseBollywoodProducer() { // Initialize bollywood } } 

如果您希望在服务中使用传递的ProducerOptions,则有两种方法可以执行此操作。 或者再次使用dependency injection,或者在扩展方法中使用服务提供者直接访问服务

 var serviceProvider = services.BuildServiceProvider() IYourService service = sp.GetService(); 

现在你有了原始的使用初始化工作。

希望能帮助到你。

编辑:

澄清。 要在服务中注入您的选项,您可以使用

 services.Configure(ProducerOptions); 

在您的扩展方法中,并通过您的服务构造函数传递给您

 public YourService(IOptions) 

然后,您可以根据需要简化或复杂化您的选项。

这种扩展的有用链接可能是.net核心的CORS存储库: https : //github.com/aspnet/CORS

评论后编辑:

我想我现在已经有了。 您希望包扩展并实现特定选项,类似于serilog对不同接收器的作用。 小菜一碟。

废弃ProducerOptions实现。

假设您有一个带有初始空结构(BaseProducer库)和接口的基础包

 public interface IProducerOptions { // base method signatures } 

您的服务扩展现在变为

 public static class FilmProducerServiceExtensions { public static IServiceCollection AddFilmProducer(this IServiceCollection services, Action options) { // Do additional service initialization return services; } } 

现在,您创建一个包含特定“好莱坞制作人”选项的新包,并且您希望扩展基本选项集

 public static class HollyWoodExtensions { public static void UseHollywoodProducer(this IProducerOptions options) { // Add implementation } } 

根据需要创建任意数量的包和IProducerOptions扩展,添加的方法将开始出现在Startup.cs中

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