2014-11-26 6 views
0

Я использую Ninject.MVC3 для своих DI.Упростить NinjectWebCommon RegisterServices с общим сервисом

У меня есть более чем 25 зависимостей для инъекционных, но моих RegisterService теперь имеет 25 строк с simlar кода, как:

private static void RegisterServices(IKernel kernel) 
     { 
      kernel.Bind<IClientRepository>().To<ClienteRepository>(); 
      kernel.Bind<IRegionRepository>().To<RegionRepository>(); 
      kernel.Bind<IRequestTypeRepository>().To<SolicitudTipoRepository>(); 
      kernel.Bind<OrdenRepository>().To<OrdenRepository>(); 
      //Some other references.... 
     } 

Но можно создать общий репозиторий (или интерфейс хранилища), чтобы наследовать все мои операции РЕПО и вводить только общий класс?

ответ

0

хорошо один из способов сделать это делает запрос ваши сборки по интерфейсу и реализации с помощью отражения, вы должны определить, какие пространства имен вы хотите сканировать что-то вроде:

string[] namespaces = { "namespace1", "namespace2", "namespace3", "namespace4" }; 
//scanning assemblies 
List<Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(x => x.FullName.Contains("mybasenamespace")).ToList(); 
      foreach (var reg in assemblies.Select(assembly => (from type in assembly.GetExportedTypes() 
                   where !type.IsInterface && type.GetInterfaces().Any() && namespaces.Any(n => type.Namespace != null && type.Namespace.Contains(n)) 
                   select new 
                   { 
                    Service = type.GetInterfaces().SingleOrDefault(t => t.Name.Contains(type.Name)), 
                    Implementation = type 
                   })).SelectMany(registrations => registrations.Where(reg => reg.Service != null))) 
      { 
       //do your registrations by type here kernel.bind etc, etc 
      } 

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

+0

я просто читал статью о 'метода GetAssemblies': https://social.msdn.microsoft .com/Форумы/vstudio/en-US/be413ce1-5881-4668-acf5-7c8058fc7fcc/getassemblies-throws-serializationexception? forum = netfxbcl Но эти коды должны запускаться при запуске проекта, правильно? Где я должен создать метод, в каталоге 'App_Start' или в моем' Global.asax'? – MrMins

+0

рекомендуется выполнить это при загрузке приложения, когда вы настраиваете свои зависимости к контейнеру, это может быть либо глобальный asax, либо любое другое «место», –

0

Это позволяет использовать общий шаблон репозитория.

kernel.Bind(typeof(ICacheRepository<>)).To(typeof(ICacheRepository<>)).InRequestScope(); 

Внутри контроллера, необходимо указать точный общий тип, например,

protected ICacheRepository<MockDataSetEnum> LocalCache; 

public PlayAreaController(ICacheRepository<MockDataSetEnum> LocalCache) 
{ 
    this.LocalCache = LocalCache; 
} 

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

  • Нет связанных вопросов^_^