Подтвердить что ты не робот

Могу ли я регистрировать свои типы в модулях в Unity, как я могу в Autofac?

Я довольно хорошо знаком с Autofac, и одна особенность, которую я действительно люблю в Autofac, - это регистрация модулей. Кто-нибудь знает, как я могу это сделать с Unity? Мне сложно найти, какие условия использовать в Google, чтобы придумать эквивалент единства, если он есть.


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

4b9b3361

Ответ 1

Вы не можете. Просто используйте Autofac или Windsor. Вы найдете там много в Unity и что там работает неожиданным образом. Это просто не стоит вашего времени.

Ответ 2

Собственно, вы можете сделать тривиально с расширениями контейнера 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>())));
    }
}