2010-08-06 16 views
10

estoy bastante familiarizado con Autofac y una característica que realmente me gusta de Autofac es el registro de los módulos. ¿Alguien sabe cómo puedo hacer esto con Unity? Me está costando encontrar los términos que debo usar en Google para encontrar el equivalente de unidad, si es que hay uno.¿Puedo registrar mis tipos en módulos en Unity como puedo en Autofac?

 

public class Global : HttpApplication, IContainerProviderAccessor 
{ 
    private static IContainerProvider _containerProvider; 

    protected void Application_Start(object sender, EventArgs e) 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterModule(new MyWebModule()); 

     _containerProvider = new ContainerProvider(builder.Build()); 
    } 

[...] 

    public IContainerProvider ContainerProvider 
    { 
     get { return _containerProvider; } 
    } 
} 

public class MyWebModule: Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterModule(new ApplicationModule()); 
     builder.RegisterModule(new DomainModule()); 
    } 
} 

public class ApplicationModule: Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.Register(c => new ProductPresenter(c.Resolve<IProductView>())) 
       .As<ProductPresenter>() 
       .ContainerScoped(); 
    } 
} 
 

Respuesta

3

No puede. Solo use Autofac o Windsor. Usted encontrará que hay una gran cantidad faltante en la unidad y lo que hay que funciona de manera inesperada. Simplemente no vale la pena tu tiempo.

+0

Estaba calculando tanto, gracias. – Adam

+5

¿Qué falta específicamente en Unity? ¿Qué hace eso es inesperado? –

32

En realidad, puede hacerlo trivialmente con las extensiones de contenedores de Unity.

public class Global : HttpApplication, IContainerProviderAccessor 
{ 
    private static IContainerProvider _containerProvider; 

    protected void Application_Start(object sender, EventArgs e) 
    { 
     var container = new UnityContainer(); 
     container.AddNewExtension<MyWebModule>(); 

     _containerProvider = new ContainerProvider(container); 
    } 

[...] 

    public IContainerProvider ContainerProvider 
    { 
     get { return _containerProvider; } 
    } 
} 

public class MyWebModule : UnityContainerExtension 
{ 
    protected override void Initialize() 
    { 
     Container.AddNewExtension<ApplicationModule>(); 
     Container.AddNewExtension<DomainModule>(); 
    } 
} 

public class ApplicationModule: UnityContainerExtension 
{ 
    protected override void Initialize() 
    { 
     Container.RegisterType<ProductPrensenter>(
      new ContainerControlledLifetimeManager(), 
      new InjectionFactory(c => new ProductPresenter(c.Resolve<IProductView>()))); 
    } 
} 
Cuestiones relacionadas