代码之家  ›  专栏  ›  技术社区  ›  scottrakes

MVC项目101

  •  2
  • scottrakes  · 技术社区  · 14 年前

    我对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>();
    

    如何设置绑定以便我的控制器可以使用ScheduleService?它如何得到ModelState?

    澄清: 我想将其注入schedule服务类,该类处理业务逻辑。我有九项工作,只是不知道如何处理依赖关系。下面是我的控制器代码。

    public class ScheduleController : ActivityController
    {
        private IScheduleService scheduleService;
    
    
        public ScheduleController(IScheduleService scheduleService)
        {
            this.scheduleService = new ScheduleService(new ModelStateWrapper(this.ModelState));
        }
    

    谢谢你的耐心,我可能问得不对。它可以构建,但是当我运行它时,我得到:

    激活IValidationary时出错 没有可用的匹配绑定,并且类型不可自绑定。 激活路径: 3) 在ScheduleService类型构造函数的参数验证字典中注入依赖项IValidationDictionary 2) 在ScheduleController类型构造函数的参数scheduleService中注入依赖isScheduleService 1) 调度控制器请求

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

    3 回复  |  直到 11 年前
        1
  •  1
  •   Dave Thieben    14 年前

    你可以考虑的一件事是注射一个工厂来生产肠球菌。例如,您的控制器构造函数将采用IValidationFactory,而IValidationFactory有一个方法:GetValidation(ModelStateDictionary modelState),并且您的默认实现将返回ModelStateWrapper。这允许您完整的IoC,并且您可以为单元测试注入自己的存根。

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

        2
  •  3
  •   BeRecursive    14 年前

    你的意思是说:

    设置Ninject2

    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;
        }
    }
    
        3
  •  1
  •   Mattias Jakobsson    14 年前

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

    基本上,您的问题是Ninject不知道如何解决ModelStateDictionary,因为您还没有告诉它如何解决。如果对modelstatewrapper类的依赖关系不是上下文关系,那么您只需要在Ninject中设置它就可以工作了。