2011-01-19 53 views
0

我有我认为是一个相当普遍的问题,但我似乎无法找到解决问题的好方法。如何在Unity解决它之后对对象进行后期处理?

比方说,我有一个接口IFoo的,我用团结奋进,共创富的一个实例:

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配置来完成?

回答

3

这里有两个选项。

如果您没有其他方式使用它,则方法注入将起作用 - 您可以配置方法以在创建实例时调用实例。如果您使用多种注入方法,则不能保证方法之间的顺序,但它可以工作。这仅适用于后处理方法是您创建的对象的方法。

通过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),并做你想做的。

相关问题