MVC.Net:MVC.Net与WebAPI的IOC实现
阅读原文时间:2023年07月11日阅读:1

我们通过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().ToSelf().InRequestScope();

 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>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind().To();

     RegisterServices(kernel);

     // WebApi项目必须添加此行  
     System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver =  
         new NinjectWebApi.Models.NinjectResolver(kernel);

     return kernel;  
 }  
 catch  
 {  
     kernel.Dispose();  
     throw;  
 }  

}

其它的操作都和MVC.Net一样,这样WebAPI的IOC也实现了。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章