Dependency injection 如何绑定服务dll的依赖项';它位于.NET核心的那一层

Dependency injection 如何绑定服务dll的依赖项';它位于.NET核心的那一层,dependency-injection,asp.net-core,single-responsibility-principle,Dependency Injection,Asp.net Core,Single Responsibility Principle,我想在新的.NET核心世界中创建一个包含的库/服务。基本上我有几个SASS产品: ServiceProduct1:有一个UI/组件根层不需要知道的存储库层 ServiceProduct2:有一个UI/组件根层不需要知道的存储库层。它也有一个电子邮件服务 这两个服务产品在多个应用程序中使用,但是使用应用程序必须知道如何绑定存储库中隐藏的接口。此外,电子邮件服务使用依赖项注入,并且必须 在消费应用程序中绑定,即使服务正在使用它 在.NET Core之前,我会使用递归搜索DLL以查找要绑定的内容: 公

我想在新的.NET核心世界中创建一个包含的库/服务。基本上我有几个SASS产品:

ServiceProduct1:有一个UI/组件根层不需要知道的存储库层

ServiceProduct2:有一个UI/组件根层不需要知道的存储库层。它也有一个电子邮件服务

这两个服务产品在多个应用程序中使用,但是使用应用程序必须知道如何绑定存储库中隐藏的接口。此外,电子邮件服务使用依赖项注入,并且必须 在消费应用程序中绑定,即使服务正在使用它

在.NET Core之前,我会使用递归搜索DLL以查找要绑定的内容:

公共静态IKernel加载程序集(IKernel内核)
{
var type=typeof(injectdependency);
var dependencies=AppDomain.CurrentDomain.GetAssemblys()
.SelectMany(x=>x.GetMatchingTypesInAssembly(y=>type.IsAssignableFrom(y)和&y.IsClass));
var assemblies=dependencies.Select(Assembly.GetAssembly.Distinct();
加载(程序集);
返回内核;
}
然后在使用的服务中,您将执行所有绑定

我不再使用Ninject,但概念是一样的。现在,除非交换以在构建时发布dll,否则不能再使用这种方法。我不想发布我的dll


有没有其他方法来处理这个问题?

很多文档都是专门针对
ASP.NET核心的实现的,所以我可以理解为什么这会让人困惑。答案相当简单。如果您的服务是完全可执行的,即。;编译时,它们会生成一个
*.exe
,然后您需要在启动时连接您的服务-在主入口点附近的某个地方。如果您的服务只是一个
*.dll
,那么您必须有一个主机应用程序(可执行文件),它为您连接依赖项,然后将服务集合交给您,这样您就可以构造一个
IServiceProvider

这是一篇关于这个问题的好文章。以下是如何实现这一目标的示例:

公共类主机
{
公共静态void Main()
{
IServiceCollection serviceCollection=新serviceCollection();
配置服务(serviceCollection);
var应用程序=新应用程序(serviceCollection);
//跑
// ...
}
静态void配置服务(
IServiceCollection服务集合)
{
ILoggerFactory loggerFactory=新的Logging.loggerFactory();
serviceCollection.AddInstance(loggerFactory);
}
}
这里有一些标准命名约定,请注意
ConfigureServices
。然后将
应用程序
对象定义为:

公共类应用程序
{
公共IServiceProvider服务{get;set;}
公共ILogger记录器{get;set;}
公共应用程序(IServiceCollection服务集合)
{
配置服务(serviceCollection);
//在配置所有服务之前,不会生成服务提供程序。
Services=serviceCollection.BuildServiceProvider();
记录器=
Services.GetRequiredService()
.CreateLogger();
Logger.LogInformation(“已成功创建应用程序”);
}
公共作废付款(付款明细付款明细)
{
Logger.login信息(
$“开始付款{paymentDetails}”);
IPaymentService支付服务=
Services.GetRequiredService();
// ...
}
无效配置服务(IServiceCollection服务集合)
{
serviceCollection.AddSingleton();
}
}
我们现在可以想象支付服务的接口和相应的实现如下所示:

公共类付费服务:IPaymentService
{
公共ILogger记录器{get;}
公共付费服务(iLogger工厂和Logger工厂)
{
Logger=loggerFactory?.CreateLogger();
如果(记录器==null)
{
抛出新ArgumentNullException(nameof(loggerFactory));
}
Logger.LogInformation(“PaymentService已创建”);
}
}
注意

这不一定是
ASP.NET核心
应用程序