3

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

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();
    }
}
4

2 に答える 2

1

Unity はこれをすぐに実行できます。Func<IService>コンストラクターでタイプの依存関係を宣言し( で行ったようにServiceFactoryProxy)、それがどのように解決されるかを Unity に伝えますIService。コンテナーがデリゲートを生成します。


アップデート

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

それがあなたの意図である場合は、この拡張機能 for Unity をご覧になることをお勧めします。

私が知る限り、Unity 3.0 は .NET4 をサポートする予定なので、次のリリースで Unity の一部として同様のものが登場することを期待しています。


Update2

少し時間がかかりましたが、遅延プロキシ機能を完成させました。次のようなILコードを生成します

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);
  }
}

したがって、手動でコーディングされた遅延プロキシのパフォーマンスが得られますが、それらは動的に生成されます。

codeplex のTecX プロジェクトを見てください。遅延プロキシ生成は、TecX.Unity.Proxiesのソース コードで見つけることができます。使用方法のサンプルは、対応するテスト プロジェクトTecX.Unity.Proxies.Testにあります。

于 2012-03-18T12:12:59.227 に答える
1

Castleでそれを行う方法は次のとおりです。

http://litemedia.info/lazy-loading-property-with-castle-dynamicproxy2

于 2012-03-18T11:38:29.987 に答える