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, и когда меня попросят, я хочу использовать тот же оператор For <>, чтобы получить правильный экземпляр.

Похоже, я мог использовать Scan вместе со своим собственным соглашением, но я не могу точно определить, как это сделать.

Это пример код

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>())); 
     } 
    } 
} 

Edit: Похоже, мне нужно использовать нетипичный для, но как я могу справиться строительство моей уверенности, используя необщий Для?

ответ

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

Смежные вопросы