Dependency injection 实现类型较少的工厂问题

Dependency injection 实现类型较少的工厂问题,dependency-injection,castle-windsor,Dependency Injection,Castle Windsor,举个简单的例子: class Program { static void Main(string[] args) { var windsorContainer = new WindsorContainer(); windsorContainer.Install(new WindsorInstaller()); var editor = windsorContainer.Resolve<IEditor>();

举个简单的例子:

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安装程序有什么问题?

您注册的是
Func
,而不是
iViewingServiceFactory
。。。试着替换

container.Register(Component.For<Func<IReviewingServiceFactory>>().AsFactory());
container.Register(Component.For().AsFactory());

container.Register(Component.For().AsFactory());
并相应地调整代码-然后它就应该工作了

哦,还有一件事-您注册了
IReviewingService
,但没有指定默认为SINGLETON的生活方式。这很可能不是您想要的,因为只有在创建实例时,
reviews
参数才会传递给实例,这只会在第一次调用工厂时发生。。。!对工厂的其他调用将返回singleton实例


因此:将
IReviewingService
的生活方式更改为瞬态,并在工厂界面上创建适当的发布方法签名(例如
void Destroy(IReviewingService)
)。

Ah。我的印象是,如果我的构造函数参数是
Func
,那么我必须注册
Func
,而不仅仅是
T
。我只对我在Windsor注册的内容进行了更改,而不是构造函数参数中的
Func
,因为我希望它是延迟加载的。谢谢。如果您想让编辑器插入
Func
,那么可以-您需要注册
Func
。但是,当您可以注入一个
IReviewingServiceFactory
时,您真的没有理由通过调用
Func
的额外步骤来获取工厂。这是有道理的。谢谢你更新你的答案。
container.Register(Component.For<Func<IReviewingServiceFactory>>().AsFactory());
container.Register(Component.For<IReviewingServiceFactory>().AsFactory());