ModelStateDictionary циклическая зависимость - ninject не будет самостоятельно связываться - PullRequest
1 голос
/ 27 февраля 2012

Я создал начальную установку приложения MVC 3 и передал конструктору контроллера объект ModelStateDictionary в конструкторе.Это объект из пространства имен System.Web.Mvc.

Ошибка активации ModelStateDictionary с помощью неявного самосвязывания ModelStateDictionary Обнаружена циклическая зависимость между конструкторами двух служб.

Путь активации: 3) Внедрение зависимости ModelStateDictionary в словарь параметровконструктор типа ModelStateDictionary 2) Внедрение зависимости ModelStateDictionary в параметр modelDict конструктора типа HomeController 1) Запрос HomeController

Как решить эту проблему?Как мне абстрагировать это так, чтобы оно работало?Является ли это возможным?Я провел некоторый поиск в Stackoverflow и ninject.org ... но не понимаю, как это применимо, потому что я не могу напрямую изменить ModelStateDictionary.

public class HomeController : Controller
{
    private readonly ModelStateDictionary _modelDict;

    public HomeController(ModelStateDictionary modelDict)
    {
        _modelDict = modelDict;
    }

    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    }
}


public void SetupDependencyInjection()
{
    IKernel kernel = new StandardKernel();

    //kernel.Bind<>().To<>();

    DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
}


public class NinjectDependencyResolver : IDependencyResolver
{
    private readonly IResolutionRoot _resolutionRoot;

    public NinjectDependencyResolver(IResolutionRoot kernel)
    {
        _resolutionRoot = kernel;
    }


    public object GetService(Type serviceType)
    {
        return _resolutionRoot.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _resolutionRoot.GetAll(serviceType);
    }
}

Это простой пример, и я не использую этот способ в своем собственном коде ... но ситуация и теория одинаковы.ModelStateDictionary должен быть неявно самосвязанным.Ninject выбирает конструктор, который принимает объект ModelStateDictionary, даже если есть конструктор, который не принимает параметров.Не должен ли ninject вернуться к конструктору без параметров, если конструктор с наибольшим количеством параметров не работает?

1 Ответ

3 голосов
/ 27 февраля 2012

Нет, Ninject не будет пытаться использовать конструкторы, пока не найдет тот, который не потерпит неудачу. Он выбирает конструктор с большинством параметров, для которых он имеет привязку, и использует его. Если конструктор дает сбой, генерируется исключение.

...