使用.net中的ninject ioc实例化类

时间:2015-08-24 11:34:12

标签: c# asp.net-mvc ninject

我正在使用Ninject在我的ASP.NET MVC应用程序中执行一些IoC。

我有一个界面" IService.cs" :

public interface IService
{
    string method();
}

我有相应的实施" Service.cs" :

public class Service
{
    string method()
    {
        return "result";
    }
}

我已经在NinjectModule的另一个类中完成了绑定:

public class MyNinjectModule : NinjectModule
{
    public override void Load()
    {
        RegisterServices();
    }

    private void RegisterServices()
    {
        Kernel.Bind<IService>().To<Service>();
    }

}

我的A级使用此服务:

public class A
{
    private readonly IService _service;
    private int i;

    public A(IService service, int i)
    {
        this._service=service;
        this.i=i;
    }        

}

问题是,现在,我不知道如何在我的应用程序中实例化我的A类。这就是我陷入困境的地方,我怎么能打电话给Ninject 告诉我的应用程序去实现我的界面:

var myClass=new A(????) 

1 个答案:

答案 0 :(得分:1)

主要问题是您的Service课程没有实施IService

public class Service
{
    string method()
    {
        return "result";
    }
}

应该是

public class Service : IService
{
    public string method()
    {
        return "result";
    }
}

但是对于实例化类,最好的方法是使用composition root来构建对象图。在MVC中,最好通过实现IControllerFactory来处理。

public class NinjectControllerFactory : DefaultControllerFactory
{
    private readonly IKernel kernel;

    public NinjectControllerFactory(IKernel kernel)
    {
        this.kernel = kernel;
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        return controllerType == null
                   ? null
                   : (IController)this.kernel.Get(controllerType);
    }
}

用法

using System;
using Ninject;
using DI;
using DI.Ninject;
using DI.Ninject.Modules;

internal class CompositionRoot
{
    public static void Compose()
    {
        // Create the DI container
        var container = new StandardKernel();

        // Setup configuration of DI
        container.Load(new MyNinjectModule());

        // Register our ControllerFactory with MVC
        ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(container));
    }
}

Application_Start中,添加:

CompositionRoot.Compose();

您还需要为班级A创建一个界面并进行注册。无法自动解析整数,您必须明确地执行此操作。

Kernel.Bind<IClassA>().To<A>()
    .WithConstructorArgument("i", 12345);

然后您将依赖项添加到控制器。依赖关系的依赖关系会自动解决。

public class HomeController : Controller
{
    private readonly IClassA classA;

    public HomeController(IClassA classA)
    {
        if (classA == null)
            throw new ArgumentNullException("classA");

        this.classA = classA;
    }

    public ActionResult Index()
    {
        // Use this.classA here...
        // IService will be automatically injected to it.

        ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

        return View();
    }
}