依赖注入 C 和 ASP.NET 与 Unity
首先,为什么我们应该在代码中使用依赖注入?我们希望将其他组件与我们程序中的其他类分离。例如,我们有类 AnimalController,其代码如下:
public class AnimalController()
{
private SantaAndHisReindeer _SantaAndHisReindeer = new SantaAndHisReindeer();
public AnimalController(){
Console.WriteLine("");
}
}
我们看一下这段代码,我们认为一切正常,但现在我们的 AnimalController 依赖于对象_SantaAndHisReindeer。自动我的控制器不好测试,我的代码的可重用性将非常困难。
非常好的解释为什么我们应该在这里使用 Depedency Injection 和接口。
如果我们希望 Unity 能够处理 DI,那么实现这一目标的道路非常简单:)使用 NuGet(包管理器),我们可以轻松地将统一导入我们的代码。
在 Visual Studio 工具 - > NuGet 包管理器 - >管理解决方案包 - >在搜索输入中写入统一 - >选择我们的项目 - >单击安装
现在将创建两个带有好评的文件。
在 App-Data 文件夹 UnityConfig.cs 和 UnityMvcActivator.cs 中
UnityConfig - 在 RegisterTypes 方法中,我们可以看到将在我们的构造函数中注入的类型。
namespace Vegan.WebUi.App_Start
{
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>();
container.RegisterType<ISanta, SantaAndHisReindeer>();
}
}
}
UnityMvcActivator - >还有很好的评论,说这个类将 Unity 与 ASP.NET MVC 集成在一起
using System.Linq;
using System.Web.Mvc;
using Microsoft.Practices.Unity.Mvc;
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(Vegan.WebUi.App_Start.UnityWebActivator), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(Vegan.WebUi.App_Start.UnityWebActivator), "Shutdown")]
namespace Vegan.WebUi.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();
}
}
}
现在我们可以将 Controller 与 SantAndHisReindeer 类分离出去:)
public class AnimalController()
{
private readonly SantaAndHisReindeer _SantaAndHisReindeer;
public AnimalController(SantaAndHisReindeer SantaAndHisReindeer){
_SantAndHisReindeer = SantaAndHisReindeer;
}
}
在运行我们的应用程序之前,我们必须做的最后一件事。
在 Global.asax.cs 中,我们必须添加新行:UnityWebActivator.Start()
,它将启动,配置 Unity 并注册我们的类型。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Vegan.WebUi.App_Start;
namespace Vegan.WebUi
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
UnityWebActivator.Start();
}
}
}