繁体   English   中英

在 ASP.NET 核心中使用 Microsoft.Extensions.DependencyInjection 时注入 IUnityContainer 依赖项的替代方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM