2015-03-30 4 views
0

Я искал ответ, но не смог его найти. У меня есть проект, который использует StructureMap в качестве контейнера зависимостей, но теперь я хочу попробовать единство Microsoft.От StructureMap до Unity

Однако, я не мог найти, как преобразовать этот кусок кода к единице:

ObjectFactory.Initialize(cfg => 
{ 
    cfg.For<IViewFactory>().Use<DefaultViewFactory>(); 

    cfg.Scan(scan => 
    { 
     scan.TheCallingAssembly(); 
     scan.ConnectImplementationsToTypesClosing(typeof(IViewBuilder<>));       scan.ConnectImplementationsToTypesClosing(typeof(IViewBuilder<,>)); 
    }); 
}); 

Я знаю cfg.For ... часть просто призывающую container.RegisterType(); но как я могу сделать сканирование часть в единстве?

ответ

1

Non библиотека способ - с помощью отражения

Включите этот метод где-то в вашем проекте (возможно, в классе регистрации контейнера)

public static void RegisterImplementationsClosingInterface(UnityContainer container, Assembly assembly, Type genericInterface) 
{ 
    foreach(var type in Assembly.GetExecutingAssembly().GetExportedTypes()) 
    { 
     // concrete class or not? 
     if(!type.IsAbstract && type.IsClass) 
     { 
      // has the interface or not? 
      var iface = type.GetInterfaces() 
       .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() 
        == genericInterface).FirstOrDefault(); 

      if(iface != null) 
      { 
       container.RegisterType(iface, type); 
      } 
     } 

    } 
} 

RegisterImplementationsClosingInterface(container, Assembly.GetCallingAssembly(), typeof(IViewBuilder<>)); 
1

Посмотрите на Unity Auto Registration. Существует также Nuget package для использования.

Вот пример, как использовать:

var container = new UnityContainer(); 

container 
    .ConfigureAutoRegistration() 
    .ExcludeAssemblies(a => a.GetName().FullName.Contains("Test")) 
    .Include(If.Implements<ILogger>, Then.Register().UsingPerCallMode()) 
     .Include(If.ImplementsITypeName, Then.Register().WithTypeName()) 
     .Include(If.Implements<ICustomerRepository>, Then.Register().WithName("Sample")) 
     .Include(If.Implements<IOrderRepository>, 
       Then.Register().AsSingleInterfaceOfType().UsingPerCallMode()) 
     .Include(If.DecoratedWith<LoggerAttribute>, 
       Then.Register() 
         .As<IDisposable>() 
         .WithTypeName() 
         .UsingLifetime<MyLifetimeManager>()) 
     .Exclude(t => t.Name.Contains("Trace")) 
     .ApplyAutoRegistration(); 
+0

Спасибо, я приму это в качестве ответа, но я не буду использовать Unity. Это слишком много хлопот для простой работы, которую StructureMap делает по умолчанию, не требуя строк и строк и строк кода. – Alaminut

+0

Пакет nuget для автоматической регистрации Unity имеет жесткую зависимость от старой версии сборки Unity, и это не похоже, что перенаправление связывания сбоев решает проблему. На данный момент кажется, что этот пакет не может быть приемлемым решением для многих. – BenCr

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