Типичные заводские проблемы, не связанные с реализацией - PullRequest
2 голосов
/ 01 августа 2011

Возьмите этот простой пример:

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
{
}

В этом примере я ожидаю, что консоль выдаст «Reviewing ...». Тем не менее, Виндзор бросает исключения:

No component for supporting the service CastleWindsorTypedFactor.IReviewingServiceFactory was found

Что не так с моим установщиком Windsor?

1 Ответ

5 голосов
/ 01 августа 2011

Вы зарегистрировали Func<IReviewingServiceFactory> вместо IReviewingServiceFactory ... попробуйте заменить

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

с

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

и соответствующим образом адаптировать код - тогда он должен работать.

Да, и еще одна вещь - вы зарегистрировали свой IReviewingService без указания образа жизни, который по умолчанию будет SINGLETON. Скорее всего, это , а не , что вы хотите, потому что тогда ваш аргумент reviews будет передан экземпляру только при создании , что происходит только при первом вызове фабрики ...! Дополнительные вызовы на завод вернут экземпляр Singleton.

Поэтому: измените стиль жизни IReviewingService на переходный, И создайте соответствующую подпись метода деблокирования на заводском интерфейсе (например, void Destroy(IReviewingService service)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...