如何为通用对象注册autofac装饰器

时间:2013-11-25 10:34:48

标签: generics autofac cqrs

我一直在我的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();

谢谢你的帮助!

中号

0 个答案:

没有答案