猿教程 Logo

Web API配置依赖注入

在本节教程中,您将学习如何配置和使用IoC容器,来实现Web API的依赖注入。

有许多IoC容器可用于依赖注入如Ninject, Unity, castleWidsor, structuremap等等。这里我们将使用Ninject实现依赖注入。

以下是我们的示例:

public class StudentController : ApiController
{
    private IRepository _repo = null;
    public StudentController(IRepository repo)
    {
        _repo = repo;
    }
    public IList<Student> Get()
    {
        return  _repo.GetAll();
    }
}

以下是IRepository和StudentRepository类。

public interface IRepository
{
    IList<Student> GetAll();
}
public class StudentRepository : IRepository
{
    public IList<Student> GetAll()
    {
        //return students from db here
    }
}


现在,让我们使用Ninject,它将往StudentController 注入StudentRepository类。

首先,您需要使用NuGet安装Ninject库。要做到这一点,右键单击您的项目在解决方案资源管理器- >点击管理NuGet包……这将打开NuGet弹窗。现在在搜索框搜索webapicontrib如下所示。


正如您可以看到的,这将列出所有Web API的IoC容器。选择WebApiContrib.IoC.Ninjec并点击“安装”。


现在,您需要安装Ninject.Extensions.ChildKernel。搜索并安装它。


现在,为Ninject安装好必要的包后,我们需要配置它。

为了在Web API中使用依赖注入,我们需要创建一个解析器:实现IDependencyResolver接口的类。在这里,我们在Web API项目的基础设施类文件夹下创建了NinjectResolver类,如下所示。

public class NinjectResolver : IDependencyResolver
{
    private IKernel kernel;
    public NinjectResolver() : this(new StandardKernel()) 
    { 
    
    }
    public NinjectResolver(IKernel ninjectKernel, bool scope = false)
    {
        kernel = ninjectKernel;
        if (!scope)
        {
            AddBindings(kernel);
        }
    }
    public IDependencyScope BeginScope()
    {
        return new NinjectResolver(AddRequestBindings(new ChildKernel(kernel)), true);
    }
    public object GetService(Type serviceType)
    {
        return kernel.TryGet(serviceType);
    }
    public IEnumerable<object> GetServices(Type serviceType)
    {
        return kernel.GetAll(serviceType);
    }
    public void Dispose()
    {
            
    }
    private void AddBindings(IKernel kernel)
    {
        // singleton and transient bindings go here
    }
    private IKernel AddRequestBindings(IKernel kernel)
    {
        kernel.Bind<IRepository>().To<StudentRepository>().InSingletonScope();
        return kernel;
    }
}

现在,我们需要在Web API中配置NijectResolver,配置在WebApiConfig类中,如下所示。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.DependencyResolver = new NinjectResolver();
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

如您所见,HttpConfiguration.DependencyResolver设置为NinjectResolver。现在,Web API将需要使用NinjectResolver类来创建对象。

通过本节教程,您可以在Web API中配置IoC容器。



版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/webapi/webapi-di-configure.html