我的一些类有一个类似于以下的构造函数:
public class MyComponent : BaseComponent, IMyComponent
{
public MyComponent(IPostRepository postsRepo, int postId, ICollection<string> fileNames)
{
// ...
}
}
IPostRepository
是一个不稳定的依赖,但它可以在应用程序启动时初始化。postId 和 fileNames 参数仅在运行时已知。
如何使用 Castle Windsor(3.2.0,如果重要)来处理IPostRepository
依赖项的注入,同时仍然允许运行时构造函数参数?
(虽然一种方法可能是重构MyComponent
,但这将是一项重要的工作,因为代码的许多其他部分已经引用了MyComponent
。)
到目前为止,这是我得到的:我认为我需要创建一个MyComponentFactory
. 的界面MyComponentFactory
看起来像
public interface IMyComponentFactory
{
IMyComponent Create(params object[] args);
}
这IMyComponentFactory
将被注入上面的层(在我的例子中是控制器),如下所示:
public class MyController : Controller
{
private IMyComponentFactory _myComponentFactory;
public MyController(IMyComponentFactory myComponentFactory)
{
_myComponentFactory = myComponentFactory;
}
public ActionResult MyAction(int postId)
{
List<string> fileNames = new List<string>();
// ...
// Creates a new instance of the resolved IMyComponent with the IPostRepository that was injected into IMyComponentFactory and the run time parameters.
IMyComponent myComponent = _myComponentFactory.Create(postId, fileNames);
// Now do stuff with myComponent
return View();
}
}
最后,我试图让 Castle Windsor 通过IMyComponentFactory
在组合根中注册 my 来创建工厂实现,如下所示:
// Add Factory facility
container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<IMyComponentFactory>().AsFactory());
这样做会产生DependencyResolverException
一条消息
无法解析“Playground.Examples.Components.MyComponent”(Playground.Examples.Components.MyComponent)的非可选依赖项。参数“postId”类型“System.Int32”
这个错误是有道理的,我猜我需要创建一个自定义实现IMyComponentFactory
,但我不确定如何去做。