私は現在、Autofac の使用方法を学んでおり、IDisposable
決定論的にオブジェクトを破棄することに固執しています。問題を述べる前に、まず状況を提示させてください。
開始位置:
オブジェクト モデルが次のインターフェイスを介して定義されているとします。
interface IApple : IDisposable
{
void Consume();
}
interface IHorse
{
void Eat(IApple apple); // is supposed to call apple.Consume()
}
interface IHorseKeeper
{
void FeedHorse(); // is supposed to call horse.Eat(apple)
// where 'horse' is injected into IHorseKeeper
// and 'apple' is generated by IHorseKeeper on-the-fly
}
IApple
さらに、ファクトリとして使用されるデリゲートを定義します。
delegate IApple AppleFactory;
Autofac 構成:
ここで、上記の型を次のように登録します。クラスApple
との両方のコードを省略していることに注意しHorse
てください。これらは簡単に実装できるためです。
var builder = new Autofac.ContainerBuilder();
builder.RegisterType<Apple>().As<IApple>();
builder.RegisterType<Horse>().As<IHorse>();
builder.RegisterType<HorseKeeper>().As<IHorseKeeper>();
builder.RegisterGeneratedFactory<AppleFactory>();
私の問題:
method の実装方法がよくわかりませんIHorseKeeper.Feed
。これが私が現在持っているものです:
class HorseKeeper : IHorseKeeper
{
private readonly IHorse horse;
private readonly AppleFactory appleFactory;
public HorseKeeper(IHorse horse, AppleFactory appleFactory)
// ^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
// constructor injection
{
this.horse = horse;
this.appleFactory = appleFactory;
}
public void FeedHorse()
{
using (var apple = appleFactory())
{
horse.Eat(apple);
} // <- Dispose() apple now (ASAP), as it's no longer needed!
}
}
これは、Autofac に完全に依存しないため、私が希望する種類のコードです。期待どおりに機能する限り、別の IoC コンテナーでも同様に機能しAppleFactory
ます。
ただし、Autofac は私のために を処理するため、作成したすべてのオブジェクトAppleFactory
を追跡し、コンテナーの有効期間の終わりにそれら自体を必要とします。つまり、生成されたものは 2 回破棄されます。IApple
Dispose
apple
Autofac にs の有効期間を処理させる方が簡単な場合があるため、 IApple
asとして登録することは実行可能な解決策ではないと思います。.ExternallyOwned()
IApple
Autofacを使用した決定論的破棄には、 を使用してネストされたコンテナーを作成する必要がありますが、Autofac に依存するようになるため、container.BeginLifetimeScope()
これを内部で使用したくありません。また、コードを IoC に依存しないようにしたいと考えています。HorseKeeper.FeedHorse
HorseKeeper
質問:
HorseKeeper.FeedHorse
オンザフライで生成されたオブジェクトが適切に破棄されるようにしながら、IoC (Autofac) に依存しない方法で実装するにはどうすればよいですか?