3

私はさまざまなDIパターンを研究します。 そして今、私は怠惰な生涯の実装に興味があります。 たとえば、サービスのインターフェイスの背後にあるファクトリを非表示にするプロキシクラスを作成したいとします。 既存のIoCコンテナ(.NET)は、この種類のプロキシクラスを実行時に動的に作成できますか?ここで既存のIoCコンテナのどれでもレイジープロキシクラスを動的に作成できますか?

interface IService 
{ 
    void Foo(); 
    void Bar(); 
} 

class ServiceFactoryProxy : IService 
{ 
    private readonly Func<IService> _factory; 

    public ServiceFactoryProxy(Func<IService> factory) 
    { 
     if (factory == null) throw new ArgumentNullException("factory"); 
     _factory = factory; 
    } 

    public void Foo() 
    { 
     _factory().Foo(); 
    } 

    public void Bar() 
    { 
     _factory().Foo(); 
    } 
} 

答えて

1

Unityは、箱から出してこれを行います。コンストラクタにタイプFunc<IService>の依存関係を宣言し(ServiceFactoryProxyと同じように)、Unityにどのように解決するかを指示しますIService。コンテナが代理人を生成します。


アップデートは

そのプロキシはLazy<T>のカプセルのように見えます。

これがあなたの意図である場合は、this extension for Unityをご覧ください。

私が知っている限り、Unity 3.0は.NET4をサポートしているので、次のリリースでUnityの一部として登場するようなものが期待されます。


アップデート2

それは私にしばらく時間がかかったが、私は怠惰なプロキシ機能を終えました。これは、この

public class MyContract_LazyInstantiationProxy : IMyContract 
{ 
    private readonly Lazy<IMyContract> instance; 
    public MyContract_LazyInstantiationProxy(Func<IMyContract> factory) 
    { 
    Guard.AssertNotNull(factory, "factory"); 
    this.instance = new Lazy<IMyContract>(factory); 
    } 
    public IMyContract Instance 
    { 
    get { return this.instance.Value; } 
    } 
    public string Foo(Bar bar) 
    { 
    return this.Instance.Foo(bar); 
    } 
} 

だからあなたはハンドコーディング怠惰なプロキシのパフォーマンスを得るが、彼らはあなたのために動的に生成されるようになります。ILコードを生成します。

TecX project on codeplexをご覧ください。遅延プロキシの生成は、ソースコードTecX.Unity.Proxiesにあります。それを使用する方法に関するサンプルは、テストプロジェクトTecX.Unity.Proxies.Testにあります。

+1

返信いただきありがとうございますが、私はServiceFactoryProxyクラスの動的生成を参照していました。 –

+0

@DmitriyStartsev質問が間違っています。おそらく更新はあなたが望むものに近いでしょう。 –

+0

私の貧しい英語のスキルのせいかもしれません...それが残念です。この例では、Lazy は漏れ抽象の一例です。 ILoggerのコンシューマーは、それが初期化されているかどうかを知るべきではありません(怠け者かどうか)。 ILoggerに依存するはずです。 ILoggerの具体的な実装は、プロキシクラスを使用してロガーの遅延初期化を提供します。もっと読むhttp://blog.ploeh.dk/2011/03/04/ComposeObjectGraphsWithConfidence.aspx私の質問は、実行時にこのプロキシクラスを生成する方法でした。 –

関連する問題