2013-02-21 4 views
0

Я использую Castle Windsor и DynamicProxy для реализации настойчивости. Lazy Загрузка с нуля (я знаю, что NHibernate может быть вариантом и т. Д.). Я реализовал настраиваемый компонент-активатор, чтобы всегда создавать мои бизнес-классы в качестве прокси. Я обнаружил, что прокси-серверы по умолчанию, созданные автоматически при использовании перехватчиков, не использовались при вызове методов класса из самого класса, что было проблемой. Поэтому я унаследовал DefaultComponentActivator и переопределяет CreateInstance() Я вызываю CreateClassProxy(), чтобы получить прокси-сервер, который наследуется от бизнес-класса, который в этом отношении отлично работает.Что такое ожидаемый LifeStyle активатора компонента Windsor Castle?

Теперь я ожидал, что этот активатор «ProxyComponentActivator» будет создан экземпляром только один раз, но для каждого типа класса создается новый экземпляр. Это верно?

Текущая регистрация, как это:

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

Каждый компонент в Виндзоре получит свой экземпляр активатора

+0

Итак, я не делаю это неправильно. Любая причина, почему она не может быть одиночной? Похоже, что его можно использовать повторно. Благодарю. –