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

以下是在 Castle 中的操作方法:

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

于 2012-03-18T11:38:29.987 回答
1

Unity 开箱即用。您在构造函数中声明类型的依赖项Func<IService>(就像您对 所做的那样ServiceFactoryProxy)并告诉 Unity 它应该如何解析IService. 容器将为您生成委托。


更新

该代理看起来像Lazy<T>.

如果这是您的意图,您可能想看看Unity 的这个扩展

据我所知,Unity 3.0 将支持 .NET4,所以我希望在下一个版本中会出现类似的东西作为 Unity 的一部分。


更新2

我花了一段时间,但我完成了惰性代理功能。它生成如下所示的 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 回答