2016-06-17 149 views
0

我使用命令和命令處理程序與卡斯泰爾溫莎註冊。有一些例子:城堡溫莎複雜通用註冊

//command 
public class DeleteEntityComand : ICommand 
    { 
     public int Id { get; set; } 
    } 

//command handler 
public class DeleteEntityCommandHandler : ICommandHandler<DeleteEnityComand> 
    { 
    ... 
    } 

//registrations 
Types.FromAssembly(Assembly.GetAssembly(typeof(DeleteEntityCommandHandler))) 
        .BasedOn(typeof(ICommandHandler<>)) 
        .WithService.AllInterfaces().LifestyleTransient() 

它的工作原理非常完美。但現在我想用通用的命令處理程序是這樣的:

//command 
public class SoftRemoveCommand<T> : ICommand 
    { 
     public int Id { get; set; } 
    } 

//command handler 
public class SoftRemoveCommandHandler<T> : ICommandHandler<SoftRemoveCommand<T>> 
    { 
    .. 
    } 

但不幸的是在這種情況下,以前的註冊不起作用。它試圖解決我的抽象BaseCommandHandler,它也實現了ICommandHandler接口。那麼如何正確地註冊我的通用命令處理程序呢?

更新:

//registrations 
Types.FromAssembly(Assembly.GetAssembly(typeof(DeleteEntityCommandHandler))) 
        .BasedOn(typeof(ICommandHandler<>)) 
        .WithService.AllInterfaces() 
        .WithService.Base() 
        .LifestyleTransient() 

城堡試圖解決SoftRemoveCommandHandler<SoftRemoveCommand<T>>但不SoftRemoveCommandHandler<T>,它拋出一個異常 「庫侖沒有代理」:

加入WithService.Base後。

是否有可能讓Castle解決SoftRemoveCommandHandler<T>而不是SoftRemoveCommandHandler<SoftRemoveCommand<T>>

+1

您是否可以發佈顯示問題的編譯代碼片段?也許是要點? – Marwijn

回答

0

你可以發佈更多的代碼嗎?所以我可以更好地理解它,特別是你正在嘗試的.Resolve<>行。

我假設你的解決方案行看起來像這樣:container.Resolve<ICommandHandler<SoftRemoveCommand<int>>()例如。

我認爲問題在於,當Castle試圖解決這個問題時,它只知道開放式仿製藥的「一級」 - ...BasedOn(typeof(ICommandHandler<>))..之一。你需要幫助城堡解決「內在」的問題。

This article似乎解決了這個問題。請參閱Krzysztof的答案和博客