TypedFactoryFacility: как инициализировать объект с помощью встроенного параметра? - PullRequest
0 голосов
/ 14 июня 2011

Как я могу произвести такой же вывод, как указано ниже, используя TypedFactoryFacility?

public class Something    
{
    public void Initialize(Whatever instance) {}
}

public interface ISomethingFactory
{
    Something Create(Whatever instance);
}

internal class SomethingFactory : ISomethingFactory
{
    private readonly IWindsorContainer _container;

    public SomethingFactory(IWindsorContainer container)
    {
        _container = container;
    }

    public Something Create(Whatever instance)
    {
        Something item = _container.Resolve<Something>();
        item.Initialize(instance);
        return item;
    }
}

Поэтому я хочу заменить фабрику вручную созданной прокси ITypedFactoryFacility, но я не могу найти способ вызвать что-тона разрешенном компоненте после создания.Я посмотрел на комиссионные, но у вас нет ссылки на CreationContext из пользовательской комиссии, так что это не сработает.Я, конечно, мог бы переместить зависимость в ctor и предоставить переопределение ctor, но я думаю, что свойства хороши, когда вы хотите передать необязательные зависимости.

1 Ответ

2 голосов
/ 14 июня 2011

Вам не нужно вызывать вещи в экземпляре при создании - Windsor автоматически добавит вещи , когда имя параметра в сигнатуре фабричного метода совпадает с чем-то, что может быть введено - будь то параметры конструктора или публичные свойства ... краткий пример (использование публичной собственности):

interface ISomeFactory
{
    Something CreateSomething(object dataSource);
}

class Something
{
    public object DataSource { get; set; }
}

Учитывая, что они зарегистрированы так:

container.Register(Component.For<ISomeFactory>().AsFactory(),
                   Component.For<Something>().Lifestyle.Transient)

вы можете разрешить экземпляры Something следующим образом:

var aintThatSomething = someFactory.CreateSomething(new [] {"ZOMG!", "w00t!"});

Помните, что если что-то внутри бремени, связанного с экземпляром Something, требует вывода из эксплуатации, вам также необходимо предоставить соответствующий метод Release на заводе.

...