Asp.net mvc 用于MVC的Ninject 101

Asp.net mvc 用于MVC的Ninject 101,asp.net-mvc,ninject,Asp.net Mvc,Ninject,我是Ninject的新手,正在尝试解决实现问题。我正在搜索和阅读,有人能给我指出一些关于Ninject和MVC的好例子和文档吗 我可以让基础工作正常,我正在努力处理具有依赖关系的绑定。例如,我有以下课程: public class ScheduleService : IScheduleService { private IValidationDictionary validationDictionary; public ScheduleService(

我是Ninject的新手,正在尝试解决实现问题。我正在搜索和阅读,有人能给我指出一些关于Ninject和MVC的好例子和文档吗

我可以让基础工作正常,我正在努力处理具有依赖关系的绑定。例如,我有以下课程:

  public class ScheduleService : IScheduleService
    {
        private IValidationDictionary validationDictionary;
        public ScheduleService(IValidationDictionary validationDictionary)
         {
             this.validationDictionary = validationDictionary;
         }
    }
这取决于:

public class ModelStateWrapper : IValidationDictionary
    {
        private ModelStateDictionary _modelState;

        public ModelStateWrapper(ModelStateDictionary modelState)
        {
            _modelState = modelState;
        }
我要为其创建绑定的:

 Bind<IValidationDictionary>()
                    .To<ModelStateWrapper>();

                Bind<IScheduleService>()
                    .To<ScheduleService>();
谢谢你的耐心,我可能问得不对。它可以构建,但当我运行它时,我会得到:

激活IValidationDictionary时出错 没有匹配的绑定可用,并且类型不可自绑定。 激活路径: 3将依赖项IValidationDictionary注入ScheduleService类型构造函数的参数validationDictionary 2将依赖项IsScheduleService注入ScheduleController类型构造函数的参数scheduleService 1对ScheduleController的请求

建议: 1确保您已为IValidationDictionary定义了绑定。 2如果绑定是在模块中定义的,请确保模块已加载到内核中。 3确保您没有意外创建多个内核。
4如果您使用的是自动模块加载,请确保搜索路径和筛选器正确。

您的意思是:

设置Ninject 2


你真的不能这么做。modelstate是控制器在初始化时设置的。我不知道Ninject,但您应该能够对服务进行上下文解析,并将其传递给当前的modelstate。这不是一个很好的解决方案,我不推荐它


基本上,这里的问题是Ninject不知道如何解决ModelStateDictionary,因为您没有告诉它如何解决。如果对MyStaseWrPrter类的依赖性是其他上下文无关的,那么您只需要在NIXEB中设置它使其工作。

< P>您可以考虑注入工厂来生成iValueDebug字典。例如,控制器构造函数将采用IValidationFactory,而IValidationFactory有一个方法:GetValidationModelStateDictionary modelState,默认实现将返回ModelStateWrapper。这允许您使用完整的IoC,并且您可以为单元测试注入自己的存根


如果IValidationDictionary上只有一个或两个方法,您也可以将ModelState传递到被调用的方法中,而不是尝试将其注入构造函数。

我可能会重新考虑这个解决方案。ModelState是特定操作的上下文,因此不能在全局级别注入。这也可能是相关的:您能展示一些这方面的代码吗。我不知道该怎么做你的第一部分没有按方法传递在重新阅读原始问题并仔细思考之后,我认为我的答案是错误的,或者无效的。他要求ISScheduleService注入ModelStateWrapper,而不是控制器。由于控制器无法控制schedule服务的创建,因此无法将其转换为ModelState。如果必须在应用程序中执行此操作,我会将ModelStateWrapper作为IValidationDictionary参数传递给在IsScheduleService上调用的方法;
public class ScheduleController : ActivityController
{
    private IScheduleService scheduleService;


    public ScheduleController(IScheduleService scheduleService)
    {
        this.scheduleService = new ScheduleService(new ModelStateWrapper(this.ModelState));
    }
public class MvcApplication : NinjectHttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        //Here goes routing setup
    }

    protected override void OnApplicationStarted()
    {
        RegisterRoutes(RouteTable.Routes);
        RegisterAllControllersIn(Assembly.GetExecutingAssembly());
    }

    protected override IKernel CreateKernel()
    {
        return new StandardKernel(new ServiceModule());
    }
}

internal class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<IValidationDictionary>().To<ModelStateWrapper>();
        Bind<IScheduleService>().To<ScheduleService>();
    }
}
public class HomeController : Controller
{
    private readonly IValidationDictionary _validationDictionary;
    private readonly IScheduleService _scheduleService;

    public HomeController(IValidationDictionary validationDictionary, IScheduleService scheduleService)
    {
        _validationDictionary = validationDictionary;
        _scheduleService = scheduleService;
    }
}