Как выполнить постобработку объекта после того, как Unity его разрешит? - PullRequest
0 голосов
/ 20 января 2011

У меня есть, как мне кажется, довольно распространенная проблема, но я не могу найти хорошего способа ее решения.

Допустим, у меня есть интерфейс IFoo, и я использую Unity для создания экземпляра Foo:

class Foo : IFoo {}
IFoo foo = Container.Resolve<IFoo>();

После инициализации я хотел бы вызвать метод для постобработки FooPostProc, который принимает объект Foo (не интерфейс IFoo) Например, я хотел бы

return Container.Resolve<IFoo>();

эквивалентно:

void FooPostProc(Foo obj){}
Foo obj = new Foo();
FooPostProc(obj) ;
return obj ;

По сути, я хотел бы указать в конфигурации контейнера Unity (желательно в xml) метод для вызова конкретного экземпляра объекта сразу после создания объекта. Я делаю это, так как не могу добавить дополнительные конструкторы к исходному объекту Foo.

Я вижу некоторые намеки на то, что это возможно с помощью перехвата Unity, но это выглядит очень сложным. Есть ли достаточно простой способ сделать это с помощью конфигурации Unity?

1 Ответ

3 голосов
/ 21 января 2011

Здесь есть два варианта.

Если вы не используете его по-другому, внедрение метода будет работать - вы можете настроить методы для вызова экземпляра при его создании. Там нет гарантии упорядочения между методами, если вы используете несколько методов инъекции, но это работает. Это работает, только если метод постобработки является методом созданного вами объекта.

Через API вы делаете:

container.RegisterType<IFoo, Foo>(
  // ... constructor, property configuration
  new InjectionMethod("FooPostProc"));

или в XML:

<register type="IFoo" mapTo="Foo">
  <method name="FooPostProc" />
</register>

Вы также можете передавать параметры в метод так же, как и в конструктор.

Другим вариантом является использование недокументированного, но включенного, BuilderAwareStrategy. Вам нужно написать небольшое расширение Unity, чтобы добавить стратегию в контейнер.

Как только вы это сделаете, вы сможете реализовать интерфейс Microsoft.Practices.ObjectBuilder2.IBuilderAware. В конце процесса разрешения контейнер будет вызывать IBuilderAware.OnBuiltUp. Опять же, это требует, чтобы вы реализовали метод для разрешаемого типа.

Например:

public class myClass : IBuilderAware
{
.. regular class implementation..
public void OnBuiltUp(NamedTypeBuildKey buildkey) {}
public void OnTearingDown() {}
}

Если метод постобработки не относится к разрешаемому объекту, самым быстрым будет использование InjectionFactory (только API, без XML) и делать все, что вы захотите.

...