0

我有這個登記StructureMap使用ConstructedBy連同非通用對於

ObjectFactory.Initialize(x => { 
    x.For<IPageModel>().UseSpecial(y => y.ConstructedBy(r => ((MvcHandler) HttpContext.Current.Handler).RequestContext.RouteData.GetCurrentModel<IPageModel>())); 
}); 

然後我訪問這個對象在我的構造這樣

public HomeController(IPageModel model) {} 

現在我想對所有登記實現了IPageModel接口的具體類型,並且在詢問時我想使用相同的語句來獲取正確的實例。

看來我可以使用掃描與我自己的約定一起做到這一點,但我無法弄清楚如何做到這一點。

這是一些示例代碼

x.Scan(scanner => 
{ 
    scanner.AssembliesFromApplicationBaseDirectory(); 
    scanner.Convention<MySpecialConvetion>(); 
}); 

public class MySpecialConvetion : IRegistrationConvention { 
    public void Process(Type type, Registry registry) { 
     if(type.IsAssignableFrom(typeof(IPageModel))) { 
      registry.For<CONCRETE IMPLEMENTATION>().UseSpecial(y => y.ConstructedBy(r => ((MvcHandler) HttpContext.Current.Handler).RequestContext.RouteData.GetCurrentModel<CONCRETE IMPLEMENTATION>())); 
     } 
    } 
} 

編輯:好像我需要使用非通用對,但我怎麼能處理好建設我自己使用非通用呢?

回答

0

我通過創建一個通用的方法定義來獲得這個工作,並使用反射來填充類型。更方便地顯示不是解釋:

public class MySpecialConvetion : IRegistrationConvention 
    { 
     public static readonly MethodInfo RegisterMethod = typeof (MySpecialConvetion) 
      .GetMethod("Register", BindingFlags.NonPublic | BindingFlags.Static) 
      .GetGenericMethodDefinition(); 

     public void Process(Type type, Registry registry) 
     { 
      if (type.IsAssignableFrom(typeof (IPageModel))) 
      { 
       var specificRegisterMethod = RegisterMethod.MakeGenericMethod(new[] { type }); 
       specificRegisterMethod.Invoke(null, new object[] { registry }); 
      } 
     } 

     static private void Register<T>(Registry registry) 
      where T : IPageModel 
     { 
      registry 
       .For<T>() 
       .UseSpecial(y => y.ConstructedBy(r => GetCurrentPageModel<T>())); 
     } 

     static private T GetCurrentPageModel<T>() 
      where T : IPageModel 
     { 
      var handler = (MvcHandler) HttpContext.Current.Handler; 
      if (handler == null) 
       return default(T); 
      return handler.RequestContext.RouteData.GetCurrentModel<T>(); 
     } 
    } 

我增加了一箇中間步驟,並檢查空處理程序,因爲我沒有一個在我的網站。但是,這應該讓你找到你需要的缺失部分。

+0

非常感謝您的幫助! – Marcus

相關問題