举这个简单的例子:
class Program
{
static void Main(string[] args)
{
var windsorContainer = new WindsorContainer();
windsorContainer.Install(new WindsorInstaller());
var editor = windsorContainer.Resolve<IEditor>();
editor.DoSomething();
Console.ReadKey();
}
}
public class WindsorInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<ISomeOtherDependency>().ImplementedBy<SomeOtherDependency>());
container.Register(Component.For<IReviewingService>().ImplementedBy<ReviewingService>());
container.Register(Component.For<IEditor>().ImplementedBy<Editor>());
container.Register(Component.For<Func<IReviewingServiceFactory>>().AsFactory());
}
}
public interface IEditor
{
void DoSomething();
}
public class Editor : IEditor
{
private readonly Func<IReviewingServiceFactory> _reviewingService;
public Editor(Func<IReviewingServiceFactory> reviewingService)
{
_reviewingService = reviewingService;
}
public void DoSomething()
{
var rs = _reviewingService();
var reviews = new List<string> {"Review #1", "Review #2"};
var reviewingService = rs.Create(reviews);
reviewingService.Review();
}
}
public interface IReviewingServiceFactory
{
IReviewingService Create(IList<string> reviews);
}
public interface IReviewingService
{
void Review();
}
public class ReviewingService : IReviewingService
{
private readonly IList<string> _reviews;
private readonly ISomeOtherDependency _someOtherDependency;
public ReviewingService(IList<string> reviews, ISomeOtherDependency someOtherDependency)
{
_reviews = reviews;
_someOtherDependency = someOtherDependency;
}
public void Review()
{
Console.WriteLine("Reviewing...");
}
}
public interface ISomeOtherDependency
{
}
public class SomeOtherDependency : ISomeOtherDependency
{
}
在这个例子中,我希望控制台输出“正在审核...”。然而,Windsor 抛出异常:
No component for supporting the service CastleWindsorTypedFactor.IReviewingServiceFactory was found
我的 Windsor 安装程序出了什么问题?
最佳答案
您注册了Func<IReviewingServiceFactory>
而不是IReviewingServiceFactory
...尝试更换
container.Register(Component.For<Func<IReviewingServiceFactory>>().AsFactory());
与
container.Register(Component.For<IReviewingServiceFactory>().AsFactory());
并相应地调整代码 - 然后它应该可以工作。
哦,还有一件事 - 你注册了你的 IReviewingService
不指定生活方式,默认为 SINGLETON。这很可能不是您想要的,因为这样您的 reviews
参数只会在创建时传递给实例,这仅在第一次调用工厂时发生......!对工厂的其他调用将返回单例实例。
因此:改变IReviewingService
的生活方式到 transient ,并在工厂接口(interface)上创建适当的发布方法签名(例如 void Destroy(IReviewingService service)
)。
关于dependency-injection - 无实现类型工厂问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6902743/