2012-12-12 45 views
0

如果我有下面的代碼包裝解決實例 - 團結依賴注入

[Serializable] 
public abstract class ValidatedCommandArgs 
{ 
} 

public interface IValidatedCommand<T> 
    where T : ValidatedCommandArgs 
{ 
    IEnumerable<ValidationError> Execute(T args); 
} 

現在一個簡單的實現

public class CreateClientArgs : ValidatedCommandArgs 
{ 
    public string Code { get; set; } 
    public string Name { get; set; } 
} 

public class CreateClientCommand : IValidatedCommand<CreateClientArgs> 
{ 
    public IEnumerable<ValidationError> Execute(CreateClientArgs args) 
    { 
     throw new NotImplementedException(); 
    } 
} 

然後註冊的命令處理程序

container.RegisterType<IValidatedCommand<CreateClientArgs>>, CreateClientCommand>(); 

現在我想要什麼能夠做的就是包裝每一個IValidatedCommand的分辨率,這樣我就可以做到這一點

public class LoggedCommandHandler<T> : IValidatedCommand<T> 
    where T : ValidatedCommandArgs 
{ 
    readonly IValidatedCommand<T> Inner; 

    public LoggedCommandHandler(IValidatedCommand<T> inner) 
    { 
     this.Inner = inner; 
    } 

    IEnumerable<ValidationError> IValidatedCommand<T>.Execute(T args) 
    { 
     //Serialize ARGS 
     //Save Inner.GetType().ClassName + the serialized args to the DB 
     return Inner.Execute(args); 
    } 
} 

然後,每當我解決(例如)IValidatedCommand<CreateClientArgs>我真的得到LoggedCommandHandler<CreateClientArgs>它的實例與inner = CreateClientCommand

對不起解決的這麼詳細,但我不記得什麼技術被稱爲。

+0

感謝格式編輯塞巴斯蒂安! –

回答

2

你在找什麼叫做Decorator Pattern

有一個extension for Unity可以幫助您使用它。


更新

This solution比一個由吉姆·克里斯托弗更加明確。

+0

謝謝塞巴斯蒂安。您的答案導致的解決方案不適用於兒童容器,並且由於您必須註冊內容的方式而不是100%適合,但代碼確實將我引向了我自己的解決方案。 如果您編輯它幷包含我自己的答案中的鏈接,我會很樂意接受您的答案。 –

+0

@PeterMorris請參閱我的更新。 –

0

我建議你看看Unity的Policy Injection/Interception方面。這允許您以非常輕巧和分離的方式進行裝飾。這將是最簡單的方法。

你基本上會擁有一個調用處理程序,只要調用Execute方法就會執行,它會記錄到數據庫然後調用「真實」類。

看看ICallHandler接口,HandlerAttribute和一般的攔截擴展。