.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.Hollywood
和Producer.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(); });