2010-08-06 13 views
10

Autofac'ı oldukça tanıyorum ve Autofac hakkında gerçekten sevdiğim bir özellik, modüllerin kaydedilmesidir. Bunu Birlik ile nasıl yapabileceğimi bilen var mı? Varsa Google’da kullanılacak terimlerin, varsa denklikle eşleşmesi için zorlu zamanları yaşıyorum.Türlerimi Autofac'da yapabildiğim gibi Unity'deki modüllere kaydedebilir miyim?

 

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(); 
    } 
} 
 

cevap

3

Yapamazsınız. Sadece Autofac veya Windsor'u kullan. Unity'de çok eksik var ve beklenmedik şekillerde çalışır. Sadece vaktine değmez.

+0

Ben çok şey yapıyorum, teşekkürler. – Adam

+5

Unity'de özellikle eksik olan nedir? Bu ne anlama geliyor? –

32

Aslında, Unity konteyner uzantıları ile önemsiz bir şekilde yapabilirsiniz.

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>()))); 
    } 
} 
İlgili konular