NInject不解析特定的依赖项

时间:2017-08-29 19:04:44

标签: c# asp.net-web-api2 ninject

到目前为止,我已经在我的Wep API2项目中使用NInject而没有遇到任何问题,但我现在正在努力解决一个奇怪的问题。

我有一个控制器,它接收3个参数来设置它的依赖关系。构造函数如下所示:

public UsersController(IUsersServices userServices, IConfigurationServices configServices, IUsersAPIProxy usersProxy) 
{
    this.configServices = configServices;
    this.userServices = userServices;
    this.usersProxy = usersProxy;
 }

无法解决的依赖是最新的:IUsersAPIProxy。其他2没有问题。 当然,定义了依赖关系的绑定,如下所示:

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中定义的,这些类型不起作用。不用说web api正确引用了两个dll。 我得到的例外情况如下:

消息: 尝试创建“UsersController”类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。

堆栈跟踪:    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 个答案:

答案 0 :(得分: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吞并了一个错误,对象可能无法实例化。