Я использую 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
Итак, я не делаю это неправильно. Любая причина, почему она не может быть одиночной? Похоже, что его можно использовать повторно. Благодарю. –