2013-02-21 55 views
0

我正在使用Castle Windsor和DynamicProxy來實現持久化從頭開始加載懶惰(我知道NHibernate可能是一個選項等)我已經實現了一個自定義組件激活器來始終將我的業務類實例化爲代理。我發現使用攔截器時自動創建的默認mixin代理在類自身內部調用類方法時未被使用,這是一個問題。因此,我繼承了DefaultComponentActivator並重寫了CreateInstance(),我調用CreateClassProxy()以獲得從業務類繼承的代理,這在該方面工作正常。Castle Windsor組件激活器的預期LifeStyle是什麼?

現在我期待這個'ProxyComponentActivator'激活器被Castle實例化一次,但是每個類的類型都會創建一個新的實例。那是對的嗎?

當前註冊是這樣的:

public void Install(
    IWindsorContainer container, 
    Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store) { 
    container.Register( 
     Classes 
      .FromAssemblyContaining(typeof(OneOfMyBusinessClasses)) 
      .InNamespace(typeof(OneOfMyBusinessClasses).Namespace) 
      .WithService.DefaultInterfaces() 
      .Configure(reg => reg.Activator<ProxyComponentActivator>()) 
      .LifestyleTransient(), 
     etc. 
    ); 
); 

活化劑實現如下:

public class ProxyComponentActivator : DefaultComponentActivator 
{ 
    protected Castle.DynamicProxy.ProxyGenerator ProxyGenerator { get; set; } 
    protected PersistenceInterceptor PersistenceInterceptor { get; set; } 


    public ProxyComponentActivator(ComponentModel model, Castle.MicroKernel.IKernelInternal kernel, ComponentInstanceDelegate onCreation, ComponentInstanceDelegate onDestruction) 
     : base(model, kernel, onCreation, onDestruction) 
    { 
     this.ProxyGenerator = kernel.Resolve<Castle.DynamicProxy.ProxyGenerator>(); 
     this.PersistenceInterceptor = kernel.Resolve<PersistenceInterceptor>(); 
    } 


    protected override object CreateInstance(CreationContext context, ConstructorCandidate constructor, object[] arguments) //, Type[] signature) 
    { 
     object instance; 

     Type implType = this.Model.Implementation; 

     ProxyGenerationOptions p = new ProxyGenerationOptions(); 

     IPersistent ip = new Persistent(); 
     p.AddMixinInstance(ip); 

     try 
     {   
      instance = this.ProxyGenerator.CreateClassProxy(implType, null, p, arguments, this.PersistenceInterceptor);     
     } 
     catch 
     { 
      throw new ComponentActivatorException("ComponentActivator: could not proxy " + implType.FullName, Model); 
     } 

     return instance; 
    } 
} 

我也試圖這樣註冊激活,無果......

Component.For<ProxyComponentActivator>() 
.ImplementedBy<ProxyComponentActivator>() 
.LifestyleSingleton() 

在此先感謝您的幫助, Luis

回答

1

Windsor的每個組件都會有自己的激活器實例

+0

好的,所以我沒有做錯。任何它不能成爲單身人士的原因?似乎它可能會被重複使用。謝謝。 – 2013-02-22 18:57:05