2015-08-11 3 views
0

У меня есть сборка и необходимо связать все классы из этой сборки с некоторым общим классом. Как это можно сделать? На данный момент я связываю это с использованием таких утверждений, как:Ninject и привязка к generics

 Bind(typeof(ICommand)).To<VillaPlus.BusinessLayer.Generic.Command.GenericFetch<Villa>>().Named("GetVillaList"); 
     Bind(typeof(ICommand)).To<VillaPlus.BusinessLayer.Generic.Command.GenericFetch<Center>>().Named("GetCentreList"); 
     Bind(typeof(ICommand)).To<VillaPlus.BusinessLayer.Generic.Command.GenericFetch<ExtraDetail>>().Named("GetExtraDetail"); 
     Bind(typeof(ICommand)).To<VillaPlus.BusinessLayer.Generic.Command.GenericFetch<Airline>>().Named("GetAirLineList"); 
     Bind(typeof(ICommand)).To<VillaPlus.BusinessLayer.Generic.Command.GenericFetch<Airport>>().Named("GetAirportList"); 
     Bind(typeof(ICommand)).To<VillaPlus.BusinessLayer.Generic.Command.GenericFetch<Title>>().Named("GetTitleList"); 

Как это можно сделать с помощью одного оператора привязки в цикле? У меня есть все типы классов, доступные из загруженной сборки.

ответ

0

Вы можете использовать Ninject.Extensions.Conventions для выбора классов, а затем привязать с помощью настраиваемого IBindingGenerator, чтобы найти тип привязки и назвать его.

Включите Conventions библиотеку, а затем в вашем запуске:

var kernel = new StandardKernel(); 

    kernel.Bind(config => 
     { 
      config.FromThisAssembly() 
       .Select(t => typeof(IMessage).IsAssignableFrom(t) && t.IsClass) 
       .BindWith(new BindingGenerator()); 
     }); 

    var commands = kernel.GetAll<ICommand>(); 
    var villaCommand = kernel.Get<ICommand>("GetVillaList"); 

это принимает на себя все классы, которые вы хотите связать реализовать IMessage

public class Villa : IMessage 
{ 
} 

тогда BindingGenerator:

public class BindingGenerator : IBindingGenerator 
{ 
    public IEnumerable<IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(Type type, IBindingRoot bindingRoot) 
    { 
     var genericType = typeof(GenericFetch<>); 
     var concreteType = genericType.MakeGenericType(type); 

     var bindings = bindingRoot.Bind(typeof(ICommand)).To(concreteType).Named("Get" + type.Name + "List"); 
     return new[] { (IBindingWhenInNamedWithOrOnSyntax<object>)bindings }; 
    } 
} 
Смежные вопросы