2010-08-06 25 views
10

Tôi khá quen thuộc với Autofac và một tính năng mà tôi thực sự yêu thích về Autofac là việc đăng ký các mô-đun. Có ai biết làm thế nào tôi có thể làm điều này với Unity? Tôi đang gặp khó khăn trong việc tìm kiếm các thuật ngữ sử dụng trong Google để tìm ra sự tương đương thống nhất nếu có.Tôi có thể đăng ký các loại của tôi trong các mô-đun trong Unity như tôi có thể trong Autofac không?

 

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

Trả lời

3

Bạn không thể. Chỉ cần sử dụng Autofac hoặc Windsor. Bạn sẽ thấy có rất nhiều bị thiếu trong Unity và những gì có hoạt động theo cách bất ngờ. Nó không chỉ đáng giá thời gian của bạn.

+0

Tôi đã tìm được rất nhiều, cảm ơn. – Adam

+5

Điều gì đặc biệt bị thiếu trong Unity? Điều gì làm điều đó là bất ngờ? –

32

Thực ra, bạn có thể thực hiện một cách tầm thường với tiện ích mở rộng vùng chứa 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>()))); 
    } 
} 
Các vấn đề liên quan