4

一般裝飾我有一個看起來像這樣的接口: 註冊在溫莎

public interface IQueryHandler<in TQuery, out TResult> 
    where TQuery : IQuery<TResult> 
{ 
    TResult Handle(TQuery query); 
} 

我想總結我的所有處理這個緩存裝飾:

public class CachingQueryHandler<TQuery, TResult> 
    : IQueryHandler<TQuery, TResult> 
    where TQuery : IQuery<TResult> 
{ 
    public CachingQueryHandler(
     IQueryHandler<TQuery, TResult> handler, 
     IQueryCachingRule<TQuery, TResult> cachingRule, 
     ITaggedCacheProvider cache) 
    { 
     //... 
    } 

    //... 
} 

那我怎麼在註冊組件溫莎:

container.Register(
    Component 
     .For(typeof(IQueryHandler<,>)) 
     .ImplementedBy(typeof(CachingQueryHandler<,>)), 
    Classes 
     .FromAssemblyContaining<GetUserCourseStatesHandler>() 
     .BasedOn(typeof(IQueryHandler<,>)) 
     .WithServiceBase() 
) 

在少數文章如果所有組件都以有效順序註冊,我會讀到Windsor可以自動連接裝飾鏈。但在我的情況下,當我試圖解決任何IQueryable<,>時,溫莎忽略我的CachingQueryHandler註冊。 在容器的命名Potentially Misconfigured Components私人領域,我發現這樣的警告:

該組件的一些依賴性不能靜態地解決。 IGSystems.Common.CQRS.CachingQueryHandler'2正在等待依賴關係 : - Service'IQueryHandler'2'指向組件本身。組件本身無法滿足依賴關係,您是否忘記註冊此服務的其他組件?

+0

'IQueryHandler'使用'in'和'out'關鍵字的原因是什麼?這表明查詢處理程序是變體,這對我來說似乎不太可能。你使用你的查詢處理程序(co/contra)變種方式? – Steven 2012-03-28 07:23:03

+0

不,這是ReSharper建議使用該關鍵字。我接受它來壓制警告,但我認爲它不會造成不好的後果。我是否正確?.. – 2012-03-28 09:07:42

+0

當你這樣做時,我不認爲會發生非常糟糕的事情:-),但我認爲它提供了一個建議,即你的查詢處理程序可以以不同的方式解決,這可能不是什麼你想要和Castle Windsor一起實現可能並不容易。對於像IEventHandler這樣的接口來說,需要變化的情況會更常見。看看我的問題[這裏](http://bit.ly/qcMCnu),以及我的博客文章,關於與Simple Injector [這裏](http://bit.ly/rpjFPU)做差異。順便說一句。你有沒有遇到過[這篇文章](http://bit.ly/s3UUyv)? – Steven 2012-03-28 09:57:11

回答

-1

那麼,如果你想要你的緩存查詢處理程序來裝飾你的實際實現,你應該重新排序你的註冊。

container.Register(
    Classes 
     .FromAssemblyContaining<GetUserCourseStatesHandler>() 
     .BasedOn(typeof(IQueryHandler<,>)) 
     .WithServiceBase(), 
Component 
     .For(typeof(IQueryHandler<,>)) 
     .ImplementedBy(typeof(CachingQueryHandler<,>)) 
) 
+0

對不起,但這不起作用。 – Steven 2013-06-26 18:26:14