Castle WindsorとDynamicProxyを使用して、永続性の遅延読み込みを最初から実装しています(NHibernateがオプションになる可能性があることはわかっています)。カスタムコンポーネントアクティベーターを実装して、ビジネスクラスを常にプロキシとしてインスタンス化しました。クラスメソッドがクラス自体の内部から呼び出されたときにインターセプターを使用すると自動的に作成されるデフォルトのミックスインプロキシが使用されていないことがわかりました。これは問題でした。そこで、DefaultComponentActivatorを継承し、CreateInstance()をオーバーライドします。CreateClassProxy()を呼び出して、ビジネスクラスから継承するプロキシを取得します。これは、この点で正常に機能します。
今、私はこの'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()
助けてくれてありがとう、ルイス