![](/img/trans.png)
[英]Integrating Microsoft.Extensions.DependencyInjection in ASP.NET 4.6.1 project
[英]Alternative for injecting a IUnityContainer dependency when using Microsoft.Extensions.DependencyInjection in ASP.NET Core?
所以在 asp.net 4 我有这个 class
public class Dispatcher : IDispatcher
{
private IUnityContainer container;
public Dispatcher(IUnityContainer container)
{
this.container = container;
}
public async Task Dispatch<T>(T evt) where T : IAtomicEvent
{
try
{
var d1 = typeof(IHandlesAtomically<>);
Type[] typeArgs = { evt.GetType() };
var makeme = d1.MakeGenericType(typeArgs);
var handler = container.Resolve(makeme);
await ((Task)handler.GetType()
.GetMethod("HandleAsync")
.Invoke(handler, new object[] { evt }));
}
catch (Exception ex)
{
throw;
}
return;
}
在 UnityConfig 我有
container.RegisterType<IDispatcher, Dispatcher>();
container.RegisterType<IHandlesAtomically<PromotionCreated>, PromotionCreatedHandler>();
在 asp.net 核心 Startup.cs 我添加了
services.AddSingleton<IDispatcher, Dispatcher>();
services.AddSingleton<IHandlesAtomically<PromotionCreated>, PromotionCreatedHandler>();
我得到的错误是
InvalidOperationException:尝试激活“RatesAvailability.Infrastructure.Dispatcher.Dispatcher”时无法解析“Unity.IUnityContainer”类型的服务。
那么如何在不使用 IUnityContainer 的情况下解决 makeme 问题?
用IServiceProvider
替换容器并使用它来解析服务
public class Dispatcher : IDispatcher {
private readonly IServiceProvider provider;
public Dispatcher(IServiceProvider provider) {
this.provider = provider
}
public Task Dispatch<T>(T evt) where T : IAtomicEvent {
try {
var d1 = typeof(IHandlesAtomically<>);
Type[] typeArgs = { evt.GetType() };
var makeme = d1.MakeGenericType(typeArgs);
var handler = provider.GetService(makeme);
return ((Task)handler.GetType()
.GetMethod("HandleAsync")
.Invoke(handler, new object[] { evt }));
} catch (Exception ex) {
throw;
}
}
}
如果在默认情况下注入提供者存在问题,那么在配置服务时考虑使用工厂委托
services.AddSingleton<IDispatcher>(serviceProvider => new Dispatcher(serviceProvider));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.