[英]Convert Autofac Open Generic Interface Registration to DryIoc Registration
我要注冊從GitHub,它提供了使用介林樣品用於使用Autofac注冊它。
我認為我的問題出在這條Autofac產品線上:
builder.RegisterAssemblyTypes(assembly)
.AsClosedTypesOf(typeof(IMessageHandler<,>))
.AsImplementedInterfaces();
我不確定100%的代碼行做什么, AsClosedTypesOf
更具體。
我試圖將其翻譯為DryIoc為:
container.RegisterMany(
new Type[] { typeof(IMessageHandler<,>) },
serviceTypeCondition: s => s.IsInterface,
setup: Setup.With(openResolutionScope: true));
但是我收到以下錯誤:
DryIoc.ContainerException:'在具體時注冊抽象實現類型SimpleMediator.Core.IMessageHandler <,>。 也沒有工廠方法代替。
到目前為止,這是我的注冊碼:
container.RegisterMany(
new Type[] { typeof(IMessageHandler<,>) },
serviceTypeCondition: s => s.IsInterface,
setup: Setup.With(openResolutionScope: true));
//var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic);
container.RegisterDelegate<ServiceFactoryDelegate>(c => t =>
{
return c.Resolve(t);
});
container.RegisterMany<ServiceFactory>();
container.RegisterMany<Mediator>();
container.RegisterMany(new Type[] { typeof(MessageProcessor<,>) });
container.Register<IService1, Service1>(Reuse.Singleton);
container.Register<IService2, Service2>(Reuse.Singleton);
var service1 = container.Resolve<IService1>();
var service2 = container.Resolve<IService2>();
service1.GetDevice("asdf");
在不為IMessageHandler接口使用RegisterMany的情況下,程序遇到錯誤:
System.ArgumentException:'未找到DeviceEventMessage Arg_ParamName_Name簽名IMessageHandler`2的處理程序'
基本上,我了解的是我需要注冊已定義的消息處理程序,該消息處理程序繼承自IMessageHandler<,>
中介者將IMessageHandler定義為:
public interface IEventHandler<in TEvent>
: IMessageHandler<TEvent, Unit> where TEvent : IMessage<Unit>
{
}
我在服務中實現它:
public class Service2 : IService2, IEventHandler<DeviceEventMessage>
{
public async Task<Unit> HandleAsync(
DeviceEventMessage message,
IMediationContext mediationContext,
CancellationToken cancellationToken)
{
return Unit.Result;
}
}
service1實際在GetDevice("asdf")
調用中介程序的地方,這需要解析處理程序。
如何在DryIoc中注冊實現IMessageHandler<,>
的類 ?
在serviceTypeCondition
添加了s.GetGenericDefinitionOrNull()
異常恰好與這里的問題有關:
container.RegisterMany(
new Type[] { typeof(IMessageHandler<,>) },
serviceTypeCondition: s => s.IsInterface,
setup: Setup.With(openResolutionScope: true));
此RegisterMany
重載期望第一個參數是具體實現類型的集合。
對於您的情況,您可能需要這樣的東西:
container.RegisterMany(
new[] { typeof(Service1).GetAssembly() },
serviceTypeCondition: s => s.GetGenericDefinitionOrNull() == typeof(IMessageHandler<,>));
順便說一句,不確定openResolutionScope: true
的原因是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.