Контейнер Breeze и Unity (HotTowel Angular + Breeze)

Мы пытаемся создать рецепт доставки на основе HotTowel Angular + Breeze. Часть внедрения зависимостей в приложении SPA хорошо освещена, но попытка разрешить BreezeController через Unity оказывается сложной задачей. Мне может не хватать чего-то там, но я не понял.

Пока вот что мы сделали:

  • Установлен загрузчик Unity для ASP.NET MVC 3.5.1404.
  • Добавлен новый контроллер под названием LoggingController, который применяет атрибут BreezeController.
  • На этом контроллере установите зависимость репозитория через конструктор

Все хорошо и чисто, контейнер Unity активируется через UnityMvcActivator.cs, который выглядит так:

    using System.Linq;
    using System.Web.Mvc;
    using Microsoft.Practices.Unity.Mvc;

    [assembly: WebActivatorEx.PreApplicationStartMethod(typeof(CC.Web.App_Start.UnityWebActivator), "Start")]
    [assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(CC.Web.App_Start.UnityWebActivator), "Shutdown")]

    namespace CC.Web.App_Start
    {
        /// <summary>Provides the bootstrapping for integrating Unity with ASP.NET MVC.</summary>
        public static class UnityWebActivator
        {
        /// <summary>Integrates Unity when the application starts.</summary>
        public static void Start() 
        {
            var container = UnityConfig.GetConfiguredContainer();
            FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
            FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));

            // TODO: Uncomment if you want to use PerRequestLifetimeManager      
            Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule       (typeof(UnityPerRequestHttpModule));
        }

        /// <summary>Disposes the Unity container when the application is shut down.</summary>
        public static void Shutdown()
        {
            var container = UnityConfig.GetConfiguredContainer();
            container.Dispose();
        }
    }
}

Контейнер настраивается через UnityConfig.cs

using System;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System.Web.Mvc;
using Microsoft.Practices.Unity.Mvc;
using System.Web.Http;

namespace CC.Web.App_Start
{
    /// <summary>
    /// Specifies the Unity configuration for the main container.
    /// </summary>
    public class UnityConfig
    {
        #region Unity Container
        private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
        {
            var container = new UnityContainer(); 
            RegisterTypes(container);
            return container;
        });

        /// <summary>
        /// Gets the configured Unity container.
        /// </summary>
        public static IUnityContainer GetConfiguredContainer()
        {
            return container.Value;
        }
        #endregion

        /// <summary>Registers the type mappings with the Unity container.</summary>
        /// <param name="container">The unity container to configure.</param>
        /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
        /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks>
        public static void RegisterTypes(IUnityContainer container)
        {
            // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
            container.LoadConfiguration();

            // TODO: Register your types here
            // container.RegisterType<IProductRepository, ProductRepository>();
        }
    }
}

При вызове контроллера кажется, что Unity не отвечает, поскольку выдает ошибку о том, что не найден пустой конструктор.

Я бы предположил, что DependencyResolver.SetResolver(new UnityDependencyResolver(container)); правильно скажет, какой преобразователь использовать, как в сообщении в блоге Майка Уоссона, упомянутом Стивом: config.DependencyResolver = new UnityResolver(container);. UnityDependencyResolver реализует IDependencyResolver.

Итак, что я спрашиваю, предполагая, что установка пакета Nuget — это только то, что необходимо для подключения Unity в качестве преобразователя, есть ли способ использовать Unity в качестве преобразователя для контроллеров Breeze или мы должны просто использовать контроллеры Breeze в качестве фасада для правильно построенный компонент IOC? Я бы предпочел, чтобы разрешение выполнялось через Unity прозрачно, а не через фасад.


person Étienne Brouillard    schedule 09.07.2014    source источник


Ответы (1)


Вам понадобится пакет Unity.AspNet.WebApi для разрешение контроллеров WebApi (включая контроллеры Breeze).

Вам также нужно указать WebApi использовать Unity для разрешения зависимостей. Обычно это делается в каком-нибудь статическом методе, который вы вызываете из Global.asax.cs. Эта запись в блоге Майка Уоссона все выкладывает.

Github-страница Unity.WebAPI предлагает использовать UnityConfig.RegisterComponents()метод для регистрации ваших репозиториев.

person Steve Schmitt    schedule 09.07.2014
comment
Спасибо, Стив, я попробую вместо этого использовать загрузчик Unity.AspNet.WebApi. - person Étienne Brouillard; 10.07.2014