語境
的同時努力簡化我們的MediatR代碼,我們爲GETALL,GetSingle,等功能創建通用的請求/響應/處理器的組合。下面你可以找到GETALL實施Autofac:註冊所有MediatR處理程序作爲內部類的泛型類型
public class GetAll<T> where T : class
{
public class Request : IRequest<Response>
{
}
public class Response
{
public IQueryable<T> All { get; set; }
}
public class Handler : IRequestHandler<Request, Response>
{
private readonly IRepository<T> repository;
public Handler(IRepository<T> repository)
{
this.repository = repository;
}
public Response Handle(Request message)
{
return new Response
{
All = repository.GetAll()
};
}
}
}
問題
我們似乎無法給我們所有的RequestHandlers一次使用Autofac註冊。
我們能夠利用我們的Autofac模塊註冊一個單一的特定類型的處理程序:
builder.RegisterGeneric(typeof(GetAll<>.Handler)).AsImplementedInterfaces();
但我們願意爲的IRequestHandler<,>
所有實現(而不僅僅是GETALL之一)這樣做。我們已經嘗試過這種使用AsClosedTypesOf
功能如文檔中建議:
builder.RegisterAssemblyTypes(typeof(GetAll<>.Request).Assembly)
.AsClosedTypesOf(typeof(IRequestHandler<,>));
或
builder.RegisterAssemblyTypes(typeof(GetAll<>.Request).Assembly)
.AsClosedTypesOf(typeof(IRequestHandler<,>))
.AsImplementedInterfaces();
但這個收益率以下異常:
Autofac.Core.Registration.ComponentNotRegisteredException :'請求的服務
'MediatR.IRequestHandler<GetAll<T>.Request,GetAll<T>.Response>'
尚未註冊。爲避免此異常,請註冊組件以提供服務,使用IsRegistered()檢查服務註冊,或使用ResolveOptional()方法解析可選的依賴項。
我們在這裏做錯了什麼(或忘記)?
也許你可以使用我的結構映射實現。由於我必須指定類型(命令<>,commandHandler <>,query <>,...),所以它遠非完美,但也許可以從這裏開始:https://gist.github。COM/hudo/0e9fb466c3fac5a04aa1b77cc95490e5 –