我一直在我的MVC应用程序中开始使用CQRS模式,并且正在尝试装饰通用命令对象IQueryHandler<,>。在其他帖子中,我已经阅读过SimpleInjector这是多么容易,例如
container.RegisterDecorator(
typeof(ICommandHandler<>),
typeof(TestCommandHandlerDecorator<>));
然而,我现在仍然坚持使用Autofac作为我选择的DI。
说我有这个界面
public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
TResult Handle(TQuery query);
}
和一些任意装饰......
public class TransactionCommandHandlerDecorator<TQuery, TResult>
: IQueryHandler<TQuery, TResult>
{
private readonly IQueryHandler<TQuery, TResult> decorated;
// etc
}
public class ValidationCommandHandlerDecorator<TQuery, TResult>
: IQueryHandler<TQuery, TResult>
{
private readonly IQueryHandler<TQuery, TResult> decorated;
// etc
}
我通过这些样式具体查询使用,例如。
public class FindEnquiryByNameQueryHandler : IQueryHandler<FindEnquiryByNameQuery, Enquiry[]>
{
private readonly EnquiryContext db;
public FindEnquiryByNameQueryHandler(EnquiryContext db)
{
this.db = db;
}
public Enquiry[] Handle(FindEnquiryByNameQuery query)
{
return db.Enquiries.Where(x => x.FirstName.Equals(query.SearchText)).ToArray();
}
}
我如何装饰IQueryHandler&lt;,&gt;同时使用ValidationCommandHandlerDecorator和TransactionCommandHandlerDecorator?
我确实在另一篇文章中发现了这样的东西,我试图使用但是还没有工作......
builder.RegisterDecorator<typeof(IQueryHandler<,>)>((c, inner) => new TransactionCommandHandlerDecorator<,>(inner), fromKey: "inner");
编辑:autofac配置
var builder = new ContainerBuilder();
builder.RegisterModule<EnquiryModule>();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.AsClosedTypesOf(typeof(IQueryHandler<,>)).AsImplementedInterfaces();
谢谢你的帮助!
中号