【问题标题】:Breeze and Unity Container (HotTowel Angular + Breeze)Breeze 和 Unity 容器(HotTowel Angular + Breeze)
【发布时间】:2014-07-09 14:11:17
【问题描述】:

我们正在尝试基于 HotTowel Angular + Breeze 创建交付配方。 SPA 应用程序中的依赖注入部分已被很好地覆盖,但尝试通过 Unity 解决 BreezeController 被证明是一个挑战。我可能在那里缺少一件事,但还没有弄清楚。

到目前为止,这是我们所做的:

  • 已安装适用于 ASP.NET MVC 3.5.1404 的 Unity 引导程序
  • 添加了一个名为 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)); 会正确地告诉使用哪个解析器,就像史蒂夫提到的 Mike Wasson 博客文章中一样:config.DependencyResolver = new UnityResolver(container);。 UnityDependencyResolver 确实实现了 IDependencyResolver。

所以我要问的是,假设安装 Nuget 包只是将 Unity 作为解析器所需要的,有没有办法将 Unity 用作 Breeze 控制器的解析器,或者我们应该简单地将 Breeze 控制器用作一个正确的 IOC 构建组件的外观?我宁愿通过 Unity 透明地完成解析,而不是通过外观。

【问题讨论】:

    标签: c# inversion-of-control unity-container breeze hottowel


    【解决方案1】:

    您将需要 Unity.AspNet.WebApi 包来解析 WebApi 控制器(包括 Breeze 控制器)。

    您还需要告诉 WebApi 使用 Unity 来解决依赖关系。通常这是在您从Global.asax.cs 调用的某个静态方法中完成的。 This blog post by Mike Wasson 说明一切。

    Unity.WebAPI Github page 建议使用 UnityConfig.RegisterComponents() 方法来注册您的存储库。

    【讨论】:

    • 谢谢史蒂夫,我会尝试使用 Unity.AspNet.WebApi 引导程序代替。
    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2015-01-14
    • 1970-01-01
    • 2014-09-06
    相关资源
    最近更新 更多