NInject не разрешает HomeController - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть проект ASP.NET MVC 4.7.2.Я использую NInject (обновлен сегодня) до 3.3.4 для поддержки зависимостей.Я не использую Интернет. Обычная вещь, которую толкает NInject.Вместо этого у меня есть:

public static class ResolverConfig
{
    public static void RegisterResolver()
    {
        INinjectModule module = new MyModule();
        IResolutionRoot kernel = new StandardKernel(module);
        NinjectDependencyResolver resolver = new NinjectDependencyResolver(kernel);
        DependencyResolver.SetResolver(resolver);
    }
}

, который находится в global.asax с:

public class MvcApplication : HttpApplication
{
    protected void Application_Start()
    {
        ResolverConfig.RegisterResolver();
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

NinjectDependencyResolver:

public class NinjectDependencyResolver :
    NinjectDependencyScope,
    System.Web.Http.Dependencies.IDependencyResolver,
    System.Web.Mvc.IDependencyResolver
{
    public NinjectDependencyResolver(IResolutionRoot resolver) : base(resolver)
    {
    }

    public System.Web.Http.Dependencies.IDependencyScope BeginScope()
    {
        return new NinjectDependencyScope(Resolver);
    }
}

Я использую тот же распознавательдля веб-API и веб-страниц.NinjectDependencyScope:

public class NinjectDependencyScope: IDependencyScope
{
    public NinjectDependencyScope(IResolutionRoot resolver)
    {
        Resolver = resolver ?? throw new ArgumentNullException(nameof(resolver));
    }

    protected IResolutionRoot Resolver { get; }

    public void Dispose()
    {
    }

    public object GetService(Type serviceType)
    {
        object instance = null;
        if (serviceType != null)
        {
            instance = Resolver.TryGet(serviceType);
        }

        return instance;
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        var all = serviceType != null ?
            Resolver.GetAll(serviceType) :
            new object[0];
        return all;
    }

Это все работает для меня в течение некоторого времени.Сегодня у меня есть контроллер Home:

public class HomeController: Controller
{
    public HomeController(IFindTerminalState engine, IWriteSubscriptionRecord writer)
    {
        Engine = engine;
        Writer = writer;
    }

    private IFindTerminalState Engine { get; }
    private IWriteSubscriptionRecord Writer { get; }

    [Route("Home/Index/{email?}/{returnUrl?}")]
    public async Task<ActionResult> Index(...)
    {
        ....
    }

    ...
}

И у меня есть модуль:

public class MyModule: NinjectModule
{
    public override void Load()
    {
        ...
        Bind<IFindTerminalState>().To<FindTerminalState>();
        ...
        string subscriptionApi = ...
        Bind<IWriteSubscriptionRecord>()
            .To<WriteMySubscriptionRecord>()
            .WithConstructorArgument("subscriptionApi", subscriptionApi);
    }
}

Обе службы, введенные в HomeController, находятся в модуле.Я запускаю веб-сайт и перехожу к ~ / Home / Index / bob @ example% 2Ecom / example% 2Ecom. Я получаю исключение, которое говорит: «Для этого объекта не определен конструктор без параметров».Этот код работал до сих пор.Есть идеи, где ошибка?

1 Ответ

0 голосов
/ 14 декабря 2018

Я идиот.У службы IWriteSubscriptionRecord есть сама зависимость, и я ее не заметил.Модуль Ninject еще не завершен.

...