我们通过Ninject(http://www.ninject.org/)项目来帮助我们实现MVC.Net与WebAPI项目的IOC实现。
首先我们来看MVC.Net的IOC实现。
1. 通过NuGet我们安装Ninject.MVC3,它会同时安装Ninject、Ninject.Web.Common和Ninject.Web.Common.WebHost。不用被它的名字干扰,它对MVC.Net 5也是适用的。
2. 安装成功后,在MVC.Net的App_Start目录中会多出一个NinjectWebCommon.cs文件。
3. 打开此文件,然后在RegisterServices方法中添加类的绑定,例如:
private static void RegisterServices(IKernel kernel)
{
// DBContext必须要per Http Request per Instance。
kernel.Bind
kernel.Bind<IPostService>().To<PostService>();
kernel.Bind<IPostRepository>().To<PostRepository>();
}
4. 这时我们就可以在直接在类中引用接口,而不用是指定该接口是由哪个具体类实现的。例如:
private DemoModelContainer _dbContext;
private IPostService _postService;
public PostController(DemoModelContainer dbContext, IPostService postService)
{
_dbContext = dbContext;
\_postService = postService;
}
5. 在系统运行后,Ninject会自动将接口对应的类给传入构造函数中。另外还有个有趣的代码就是DemoModelContainer。这个类不是一个接口,是一个EntityFramework的DBContext。在这里我们之所以使用Ninject来管理,是为了实现自动针对每个Request来实例化DBContext,同时又能保证在Request销毁后,对应的DBContext实例也同时销毁。如果不通过Ninject,那么我们就需要给每个Controller实现Dispose方法,然后显式销毁。
========================================
对于WebAPI来说,除了以上步骤,还需要多操作几步:
1. 创建NinjectResolver.cs和NinjectScope.cs两个类文件,代码如下:
NinjectResolver.cs
using Ninject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Dependencies;
namespace NinjectWebApi.Models
{
public class NinjectResolver : NinjectScope, IDependencyResolver
{
private IKernel _kernel;
public NinjectResolver(IKernel kernel)
: base(kernel)
{
_kernel = kernel;
}
public IDependencyScope BeginScope()
{
return new NinjectScope(_kernel.BeginBlock());
}
}
}
NinjectScope.cs
using Ninject.Activation;
using Ninject.Parameters;
using Ninject.Syntax;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http.Dependencies;
namespace NinjectWebApi.Models
{
public class NinjectScope : IDependencyScope
{
protected IResolutionRoot resolutionRoot;
public NinjectScope(IResolutionRoot kernel)
{
resolutionRoot = kernel;
}
public object GetService(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter\[\], true, true);
return resolutionRoot.Resolve(request).SingleOrDefault();
}
public IEnumerable<object> GetServices(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter\[\], true, true);
return resolutionRoot.Resolve(request).ToList();
}
public void Dispose()
{
IDisposable disposable = (IDisposable)resolutionRoot;
if (disposable != null) disposable.Dispose();
resolutionRoot = null;
}
}
}
2. 修改NinjectWebCommon.cs的CreateKernel方法:
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
try
{
kernel.Bind
kernel.Bind
RegisterServices(kernel);
// WebApi项目必须添加此行
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver =
new NinjectWebApi.Models.NinjectResolver(kernel);
return kernel;
}
catch
{
kernel.Dispose();
throw;
}
}
其它的操作都和MVC.Net一样,这样WebAPI的IOC也实现了。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章