一般裝飾我有一個看起來像這樣的接口: 註冊在溫莎
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'指向組件本身。組件本身無法滿足依賴關係,您是否忘記註冊此服務的其他組件?
'IQueryHandler'使用'in'和'out'關鍵字的原因是什麼?這表明查詢處理程序是變體,這對我來說似乎不太可能。你使用你的查詢處理程序(co/contra)變種方式? – Steven 2012-03-28 07:23:03
不,這是ReSharper建議使用該關鍵字。我接受它來壓制警告,但我認爲它不會造成不好的後果。我是否正確?.. – 2012-03-28 09:07:42
當你這樣做時,我不認爲會發生非常糟糕的事情:-),但我認爲它提供了一個建議,即你的查詢處理程序可以以不同的方式解決,這可能不是什麼你想要和Castle Windsor一起實現可能並不容易。對於像IEventHandler這樣的接口來說,需要變化的情況會更常見。看看我的問題[這裏](http://bit.ly/qcMCnu),以及我的博客文章,關於與Simple Injector [這裏](http://bit.ly/rpjFPU)做差異。順便說一句。你有沒有遇到過[這篇文章](http://bit.ly/s3UUyv)? – Steven 2012-03-28 09:57:11