NInject 没有解决特定的依赖关系
NInject doesn't resolve a specific dependency
到目前为止,我一直在我的 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();
}
class 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));
}
}
它的基础class也没什么特别的:
public class APIProxyBase
{
protected RestClient client = null;
public APIProxyBase()
{
client = new RestClient("http://myHost:MyPort/");
}
}
出于某种原因,我不知道我是否从控制器的构造函数中删除了 IUsersAPIProxy 参数,它按预期工作。奇怪的是,它只发生在这种依赖性下。将参数更改为其他位置当然无济于事。此外,实际工作的其他接口和 classes 要复杂得多。
值得一提的是,有效的类型定义在与无效的类型不同的 dll 中。不用说网络 api 正确引用了这两个 dll。
我得到的异常如下:
留言:
尝试创建 'UsersController' 类型的控制器时出错。确保控制器具有无参数 public 构造函数。
堆栈跟踪:
zh System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor controllerDescriptor,Type controllerType)
zh System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage 请求)
zh System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()
有人能给我指出正确的方向吗?
谢谢!
Its base class is nothing special either:
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 吞噬了一个错误,对象无法实例化。
到目前为止,我一直在我的 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();
}
class 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));
}
}
它的基础class也没什么特别的:
public class APIProxyBase
{
protected RestClient client = null;
public APIProxyBase()
{
client = new RestClient("http://myHost:MyPort/");
}
}
出于某种原因,我不知道我是否从控制器的构造函数中删除了 IUsersAPIProxy 参数,它按预期工作。奇怪的是,它只发生在这种依赖性下。将参数更改为其他位置当然无济于事。此外,实际工作的其他接口和 classes 要复杂得多。 值得一提的是,有效的类型定义在与无效的类型不同的 dll 中。不用说网络 api 正确引用了这两个 dll。 我得到的异常如下:
留言: 尝试创建 'UsersController' 类型的控制器时出错。确保控制器具有无参数 public 构造函数。
堆栈跟踪: zh System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor controllerDescriptor,Type controllerType) zh System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage 请求) zh System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()
有人能给我指出正确的方向吗?
谢谢!
Its base class is nothing special either:
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 吞噬了一个错误,对象无法实例化。