Unity делает это из коробки. Вы объявляете зависимость типа Func<IService>
в своем конструкторе (как вы сделали с ServiceFactoryProxy
) и сообщаете Unity, как она должна разрешать IService
. Контейнер сгенерирует для вас делегата.
Обновление
Этот прокси выглядит как инкапсуляция Lazy<T>
.
Если это ваше намерение, вы можете посмотреть это расширение для 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);
}
}
Таким образом, вы получаете производительность ленивых прокси, написанных вручную, но они будут генерироваться для вас динамически.
Посмотрите на проект TecX на codeplex . Генерацию отложенного прокси можно найти в исходном коде TecX.Unity.Proxies . Пример его использования приведен в соответствующем тестовом проекте TecX.Unity.Proxies.Test .