首页 > 解决方案 > NInject 没有解析 HomeController

问题描述

我有一个 ASP.NET MVC 4.7.2 项目。我使用 NInject(今天更新到)3.3.4 来维护依赖关系。我不使用 NInject 推送的 web.Common 东西。相反,我有:

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);
    }
}

我对 Web 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;
    }

这一切都为我工作了一段时间。今天我有一个家庭控制器:

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 我收到一个异常,上面写着“没有为此对象定义无参数构造函数”。这段代码一直工作到现在。知道错误在哪里吗?

标签: asp.net-mvcninject

解决方案


我是一个白痴。IWriteSubscriptionRecord 服务本身有一个依赖项,我没有注意到它。Ninject 模块尚未完成。


推荐阅读