2009-10-27 52 views
0

我有一個結構映射配置讓我撓頭。我有一個具體的類需要一個接口的UI元素,它需要一個接口的驗證類。我想讓外部具體類獲取默認的ui元素,但是獲取具體類特定的驗證對象。事情是這樣的:使用結構映射按類型設置內部依賴關係

class MyView 
{ 
    IPrompt prompt 
} 

class GenericPrompt : IPrompt 
{ 
    IValidator validator 
} 

class MyValidator : IValidator 
{ 
    bool Validate() {} 
} 

我怎樣才能用註冊表DSL配置structuremap的MyView的創建依賴時,只使用MyValidator。 (並假定在創建BobsView的依賴關係時使用BobsValidator)

+0

BobsView是否也對IPrompt有依賴性?如果沒有,你沒有問題。如果是這樣,你可能想看看配置文件。 – KevM 2009-10-28 02:55:04

回答

1

您是否從容器獲取MyView(和BobsView)?我們可以假設他們都會採用IPrompt的實例嗎?

一種方法是將所有驗證器註冊爲與您的視圖名稱匹配的名稱。你可以實現自己的型掃描儀,只是刪除了驗證後綴:

public class ValidatorScanner : ITypeScanner 
{ 
    public void Process(Type type, PluginGraph graph) 
    { 
     if (!typeof (IValidator).IsAssignableFrom(type)) return; 
     var validatorName = type.Name.Replace("Validator", ""); 
     graph.AddType(typeof(IValidator), type, validatorName); 
    } 
} 

現在,如果你承擔IPrompt將始終遵循該命名約定,你的註冊表可能看起來像一個視圖中要求:

public class ValidatorRegistry : Registry 
{ 
    public ValidatorRegistry() 
    { 
     Scan(scan => 
     { 
      scan.TheCallingAssembly(); 
      scan.With<ValidatorScanner>(); 
     }); 

     ForRequestedType<IPrompt>().TheDefault.Is.ConstructedBy(ctx => 
     { 
      var viewName = ctx.Root.RequestedType.Name.Replace("View", ""); 
      ctx.RegisterDefault(typeof(IValidator), ctx.GetInstance<IValidator>(viewName)); 
      return ctx.GetInstance<GenericPrompt>(); 
     }); 
    } 
} 

檢索與相應的驗證你的觀點,你就必須要求具體類型:

var view = container.GetInstance<MyView>(); 

請注意,如果你是retri這隻會工作直接調用容器(服務位置),因爲它取決於「Root.RequestedType」。根據你打算如何獲得你的觀點,你可能會走上BuildStack尋找一個視圖(而不是假設它總是Root)。

+0

謝謝。這讓我得到了我所需要的。任何線索爲什麼ctx上的intellisense似乎不起作用? – JoshRivers 2009-10-28 23:29:07