我正在通过模块开发应用程序。每个模块都对应于我们公司的遗留系统。使用这样的代码,我可以使用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
中的所有路由。我的挑战是在类库中定义这些路由。我还没有找到解释如何做的任何材料。
这可能吗?如果是,怎么样?
答案 0 :(得分:0)
如果可能,我会重新设计。我建议将类库中的共享组件注入特定于应用程序的控制器,但控制器和应用程序配置应该不在模块中。像这样的UI考虑应该是特定于应用程序的。
至于容器,我建议为每个组件配置统一配置,但不要在模块中引用容器(这样做是为了使容器成为服务定位器)。相反,在每个程序集中创建一个特定于模块的配置类,并在应用程序启动时将容器从UI应用程序传递到每个程序集的配置(您将依赖反射或类似访问配置)。
示例(使用UnityContainerExtension
的答案):
IoC in class library. Where to bootstrap