【问题标题】:Can I inject a route using Unity Container?我可以使用 Unity Container 注入路由吗?
【发布时间】:2015-11-03 21:23:56
【问题描述】:

我正在按模块开发应用程序。每个模块都对应于我们在公司的一个遗留系统。使用这样的代码,我可以使用 Unity Container 将类库中的控制器注入到 MVC 应用程序中:

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

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(MyProject.Common.UnityMvcActivator), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(MyProject.Common.UnityMvcActivator), "Shutdown")]

namespace MyProject.Common
{
    public static class UnityMvcActivator
    {
        /// <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();
        }
    }
}

当我安装the Unity.Mvc bootstrapper 时,此代码会自动添加到类库中。

所有作为模块实现的类库都将面向 Web。

像魅力一样工作,但我仍然必须从 MVC 应用程序中定义 RouteConfig 中的所有路由。我的挑战是在类库中定义这些路由。我还没有找到任何解释如何做的材料。

这可能吗?如果是,怎么做?

【问题讨论】:

    标签: c# asp.net-mvc unity-container


    【解决方案1】:

    如果可能,我会重新设计设计。我建议将类库中的共享组件注入到特定于应用程序的控制器中,但控制器和应用程序配置应远离模块。像这样的 UI 考虑应该是特定于应用程序的。

    至于容器,我建议对每个程序集进行统一配置,但不要在模块中引用容器(这样做是为了使容器成为服务定位器)。相反,在每个程序集中创建一个特定于模块的配置类,并在应用程序启动时将容器从 UI 应用程序传递到每个程序集的配置(您将依赖反射或类似方法来访问配置)。

    示例(使用UnityContainerExtension的答案): IoC in class library. Where to bootstrap

    【讨论】:

    • 嗯,目标正是将新的控制器从类库注入到 Web 应用程序。控制器以模块标识为前缀。我想在答案中有一些代码示例。谢谢。
    • @CiganoMorrisonMendez 从依赖程序集配置路线的困难表明您应该采取不同的方法。类库不应依赖于网络。
    • @CiganoMorrisonMendez 我推荐的注入方法的代码示例是链接中使用UnityContainerExtension 的答案。
    • 但是类库都依赖于网络。我在它们每个中都安装了 Unity 和 Unity.Mvc(抱歉遗漏)。 Unity.Mvc 安装 System.Web.Mvc 和 System.Web.Razor。我可以使用链接答案中提供的容器,但我认为允许类库自行注册特定路由没有任何问题。
    • @CiganoMorrisonMendez 当您需要进行更改时,它会成为维护问题。如果所有应用程序共享配置和控制器,那么您需要确保您的每一个应用程序都与更改兼容。然后,如果您确实进行了更改,则必须重新部署所有应用程序,或者最终在应用程序中使用不同版本的共享代码。您甚至可能会遇到让某些应用使用旧的特定“版本”配置代码和控制器的场景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2014-01-24
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2012-05-23
    • 2015-07-10
    相关资源
    最近更新 更多