2015-02-10 3 views
3

Я пытаюсь зарегистрировать общий репозиторий в единстве. Я бы предпочел сделать это в загрузчике, используя отражение.Зарегистрировать общий тип с отражениями в Unity

Я успешно реализованы и протестированы это:

container.RegisterType(typeof(MyDll.Repositories.IRepository<>), typeof(MyDll.Repositories.Repository<>), "MyDllRepository"); 

Тогда решения:

var result = target.Resolve(typeof(My.Repositories.IRepository<MyClass>), "MyDllRepository"); 

Работает отлично. Мне не нравится, что я должен явно ссылаться на MyDll в решении Bootstrapper.

Когда я пытаюсь зарегистрировать Repository автоматически с помощью отражения в моей Bootstrapper так:

private void RegisterDlls(String assembly) 
    { 
     var currentAssembly = Assembly.LoadFrom(assembly); 
     var assemblyTypes = currentAssembly.GetTypes(); 

     var baseName = GetBaseName(currentAssembly.FullName); 

     foreach (var assemblyType in assemblyTypes) 
     { 
      if (assemblyType.IsInterface) 
      { 
       continue; 
      } 

      if (assemblyType.FullName.EndsWith("Service")) 
      { 
       foreach (var requiredInterface in assemblyType.GetInterfaces()) 
       { 
        if (requiredInterface.FullName.EndsWith("Service")) 
        { 
         var typeFrom = assemblyType.GetInterface(requiredInterface.Name); 
         var typeTo = assemblyType; 
         RegisterType(typeFrom, typeTo, true, typeTo.Name); 
        } 
       } 
      } 

     if (assemblyType.Namespace.EndsWith("Repositories")) 
     { 
     foreach (var requiredInterface in assemblyType.GetInterfaces()) 
     { 
     if (requiredInterface.Namespace.EndsWith("Repositories")) 
       { 
     var typeFrom = assemblyType.GetInterface(requiredInterface.Name); 
     var typeTo = assemblyType; 
     string registerName = String.Concat(baseName, "Repository"); 
     _container.RegisterType(typeFrom, typeTo, registerName); 
       } 
    } 
    } 

При решении я получаю исключение:

Microsoft.Practices.Unity.ResolutionFailedException был необработанное кодом пользователя Сообщение = Постановление зависимости не удалось, тип = «MyDll.Repositories.IRepository 1[MyDll.Models.MyClass]", name = "MyDllRepository". Exception occurred while: while resolving. Exception is: InvalidOperationException - The current type, MyDll.Repositories.IRepository 1 [MyDll.Models.MyClass], представляет собой интерфейс, и не может быть построена.

Любые идеи?

MyDll.Repositories.Repository класс:

public class Repository<TModel> : IRepository<TModel> where TModel : class, IModel 
{ 
    [Dependency("MyDllDataProvider")] 
    public IMyDllDataProvider _dataProvider { get; set; } 
    ... 
} 

ответ

0

Вы в основном хотите зарегистрировать любую реализацию Вашего IRepository<> интерфейса права?

В Unity 3.x есть метод для такого рода регистрации на основе конвенции. В контейнере у вас есть метод RegisterTypes, который принимает различные параметры, например. сборки для сканирования, интерфейсы для поиска и т. д.

Поэтому я предполагаю, что это именно то, что вам следует делать, и оно отлично работает с универсальными типами.

Просто быстрый пример, который сканирует все сборки в каталоге «bin» или что-то другое в вашем базовом пути ... и фильтрует имя типа.

container.RegisterTypes(
    AllClasses.FromAssembliesInBasePath(), 
    (t) => t.Name.EndsWith("Service") ? new[] { t } : new Type[] { }, 
    WithName.TypeName); 

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

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

container.ResolveAll(typeof(IRepository<MyClass>)); 
+0

Спасибо. Я попробую. Сначала мне нужно будет обновить до Unity 3.x, я все еще на Unity 2.0 – user1337493

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