NInject无法解析特定的依赖项。

3
我一直在我的 Web API2 项目中使用 NInject 没有任何问题,但现在我遇到了一个奇怪的情况。我有一个控制器,接收3个参数来设置它的依赖项。构造函数如下:
public UsersController(IUsersServices userServices, IConfigurationServices configServices, IUsersAPIProxy usersProxy) 
{
    this.configServices = configServices;
    this.userServices = userServices;
    this.usersProxy = usersProxy;
 }

无法解决的依赖项是最新的依赖项:IUsersAPIProxy。其他两个没有问题。 当然,依赖项的绑定已经定义好了,就像这样:
kernel.Bind<IUsersAPIProxy>().To<UsersAPIProxy>().InRequestScope();
kernel.Bind<IUsersServices>().To<UsersServices>().InRequestScope(); 
kernel.Bind<IConfigurationServices>().To<ConfigurationServices>().InRequestScope();

IUsersAPIProxy接口非常简单:

public interface IUsersAPIProxy
{
    UserModel ReadUser(string loginName);
    IEnumerable<UserModel> ReadAllUsers();
}

UsersApiProxy类没有需要注入的依赖项:

public class UsersAPIProxy : APIProxyBase, IUsersAPIProxy
{
    public IEnumerable<UserModel> ReadAllUsers()
    {
        var request = new RestRequest("sec/users2/");           
        IRestResponse<List<UserModel>> response = client.Execute<List<UserModel>>(request);
        if (response.StatusCode == System.Net.HttpStatusCode.OK)
            return response.Data;

        throw new ApplicationException(String.Format("There was an error when trying to retrieve the users. Response content: {0}"));
    }

    public UserModel ReadUser(string loginName)
    {
        var request = new RestRequest("sec/users2/{loginName}");
        request.AddUrlSegment("loginName", loginName);
        IRestResponse<UserModel> response = client.Execute<UserModel>(request);

        if (response.StatusCode == System.Net.HttpStatusCode.OK)
            return response.Data;

        throw new ApplicationException(String.Format("There was an error when trying to retrieve data for user {0}. Response content: {1}", loginName, response.Content));
    }
}

它的基类也没什么特别之处:

public class APIProxyBase
{
   protected RestClient client = null;

    public APIProxyBase()
    {
        client = new RestClient("http://myHost:MyPort/"); 
    }
}

我不知道的原因是,如果我从控制器的构造函数中删除IUsersAPIProxy参数,则它会按预期工作。奇怪的是,这种依赖仅发生在此处。更改参数到不同位置当然无法帮助。而且,实际工作的其他接口和类要复杂得多。
值得一提的是,可以正常工作的类型在定义时使用了不同的dll,而无法正常工作的类型没有使用那个dll。不用说,web api正确引用了这两个dll。
我收到的异常如下所示: Message: 在尝试创建类型为“UsersController”的控制器时发生错误。请确保该控制器具有无参数的公共构造函数。 Stack Trace: en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) en System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) en System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()
请问有人能指导我正确的方向吗?
谢谢!

1
请发布实际的错误转储。 - JuanR
1
另外,请发布另外两个参数的Ninject绑定。 - JuanR
有效的绑定基本上是相同的:kernel.Bind<IUsersServices>().To<UsersServices>().InRequestScope(); kernel.Bind<IConfigurationServices>().To<ConfigurationServices>().InRequestScope(); - Gonzalo Méndez
2
请发布完整的错误信息,而不仅仅是您认为有用的部分。换句话说,请发布整个堆栈信息。请修改您的问题,而不是将其作为评论添加。 - JuanR
你正在使用.Net Full Framework(4.6)或Asp Net Core(1.1或2.0)吗? - Mario Guadagnin
显示剩余2条评论
1个回答

4

它的基类也没什么特别的:

public class APIProxyBase
{
    protected RestClient client = null;

    public APIProxyBase()
    {
        client = new RestClient("http://myHost:MyPort/"); 
    }
}

我认为你对这个问题有误解 - 这里有些特殊的情况。在应用程序的构建阶段中实例化依赖项,这可能依赖于运行时数据才能正常工作(例如HttpContext),而这些数据在应用程序启动时不可用。

为了测试这个假设,可以注释掉实例化RestClient的那一行代码,以查看是否注入了您的依赖项。

public class APIProxyBase
{
    protected RestClient client = null;

    public APIProxyBase()
    {
        //client = new RestClient("http://myHost:MyPort/"); 
    }
}

有可能由于Ninject吞噬了错误,导致对象无法实例化。


完全有可能。他还可以注入RestClient对象(例如接口)。这将有助于可视化依赖链和构建,可能会导致更详细的错误转储。 - JuanR
太棒了,我会尝试一下并尽快告诉你们。谢谢这个提示! - Gonzalo Méndez
你好NightOwI888,正如你所说的那样,你们救了我的一天!谢谢! - Gonzalo Méndez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接