dependency-injection - 无实现类型工厂问题

标签 dependency-injection castle-windsor

举这个简单的例子:

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/

相关文章:

c# - IoC、SRP 和组合——我是否创建了太多接口(interface)?

c# - 使用 CaSTLe Windsor 在服务类的构造函数中使用参数化构造函数初始化类

c# - CaSTLe Windsor 到 Unity - 你能像在 CW 中一样在 Unity 中自动配置吗?

c# - CaSTLe Windsor & 命令模式

asp.net-mvc-3 - 带有 MVC 和自定义 MembershipProvider 的 DI

javascript - 在使用依赖注入(inject)时,如何避免用类型检查逻辑填充我的 JavaScript 代码?

dependency-injection - 角 5 : Can't resolve all parameters for component

php - 拉维尔 5 : Type-hinting a FormRequest class inside a controller that extends from BaseController

asp.net-mvc - CaSTLe Windsor、Fluent Nhibernate 和 Automapping Isession 已关闭问题

c# - 为什么我的 Windsor Implicit Delegate Factory Registration 不起作用?