2010-08-06 106 views
10

我对Autofac非常熟悉,我真正喜欢Autofac的一个特性就是模块的注册。有谁知道我可以如何使用Unity做到这一点?我很难找到在Google中使用哪些术语来提供统一的等价物(如果有的话)。我可以在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(); 
    } 
} 
 

回答

3

你不能。只需使用Autofac或Windsor。你会发现有很多很多在Unity中失踪,有什么在意想不到的方式工作。这不值得你花时间。

+0

我很喜欢,谢谢。 – Adam 2010-08-09 13:36:18

+5

Unity中缺少什么?这是什么意外? – 2012-11-02 01:47:47

32

实际上,您可以轻松地使用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>()))); 
    } 
} 
相关问题