我有一些Castle Windsor组件注册,如下所示。
container.Register(
Component.For<IService>()
.Named("proxy-service")
.ImplementedBy<ProxyService>()
.DependsOn(Dependency.OnComponent(
typeof(IHttpClient), "backend-http-client")),
Component.For<IHttpClient>()
.Named("backend-http-client")
.ImplementedBy<DefaultHttpClient>()
.DependsOn(Dependency.OnAppSettingsValue(
"baseAddress", "backendServerBaseAddress"))
);
ProxyService
实现了IService
,并且有一个构造函数,只需要一个IHttpClient
。
DefaultHttpClient
实现了IHttpClient
,并且有一个构造函数,其中包含一个名为string
的{{1}}。
现在,如果我尝试通过调用baseAddress
来测试我的注册,则会出现以下异常。
Castle.MicroKernel.Handlers.HandlerException:无法创建组件&#39;代理服务&#39;因为它有依赖性来满足。
&#39;代理服务&#39;正在等待以下依赖项:
- 组件&#39;后端-http-client&#39; (通过覆盖)已注册,但也在等待依赖。
以下两项工作都很奇怪。
container.Resolve<IService>("proxy-service")
container.Resolve<IHttpClient>("backend-http-client")
和"proxy-service"
注册的排序。我真的很难过,因为我经常使用Castle Windsor,并且从来没有遇到过这样的问题,这显然不是由注册中的错字或错误造成的。
为什么(1)上面的工作,但解决单独依赖它的组件?
为什么(2)使其有效?注册顺序不应该重要,除非同一界面有多个注册(在我的最小减少情况下没有注册)。我有其他项目的代码,它们使用许多不同的注册做同样的事情。
我遗失了一些明显错误的东西吗?
答案 0 :(得分:3)
问题是我的小测试是在安装之前在安装程序内部运行的。
我的安装程序看起来像这样:
class WindsorInstaller : IWindsorInstaller
{
void IWindsorInstaller.Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(...);
//A little one-time test to try out the resolving of the service.
//It would be removed as soon as it works.
var service = container.Resolve<IService>("proxy-service");
}
}
我的应用程序启动看起来像这样:
container = new WindsorContainer().Install(new WindsorInstaller());
因此在Resolve
之前调用了Install
。当然,一旦我将测试呼叫移至Resolve
,以便在调用Install
之后发生这种情况,一切正常。
答案 1 :(得分:0)
在我的情况下问题是我注册了IService
但是尝试在顶级依赖项对象的构造函数中解析Service
:
public class MyController : Controller
{
private readonly IService _service;
public MyController(Service service) //problem here, Iservice should be used instead
{
_service = service;
}
}