2010-08-06 11 views
10

Je suis assez familier avec Autofac et une caractéristique que j'aime vraiment chez Autofac est l'enregistrement des modules. Est-ce que quelqu'un sait comment je peux le faire avec Unity? J'ai du mal à trouver les termes à utiliser dans Google pour trouver l'équivalent de l'unité s'il y en a un.Puis-je enregistrer mes types dans des modules dans Unity comme je peux 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(); 
    } 
} 
 

Répondre

3

Vous ne pouvez pas. Utilisez simplement Autofac ou Windsor. Vous trouverez un lot manquant dans Unity et ce qui fonctionne de manière inattendue. Cela ne vaut tout simplement pas votre temps.

+0

Je pensais autant, merci. – Adam

+5

Qu'est-ce qui manque spécifiquement dans Unity? Qu'est-ce que ça fait qui est inattendu? –

32

En fait, vous pouvez faire trivialement avec les extensions de conteneur 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>()))); 
    } 
}