在简单注入器中实现惰性代理

时间:2019-03-15 05:06:44

标签: c# generics dependency-injection simple-injector

Simple Injector文档describe如何实现惰性依赖。但是,此示例仅涵盖注册简单接口(IMyService)。这如何与开放的泛型(EG。IMyService<T>)一起使用?

这是我现有的注册信息:

container.Register(typeof(IDbRepository<>), typeof(DbRepository<>));

很显然,以下代码无法编译,因为我没有指定泛型类型:

container.Register(typeof(IDbRepository<>),
    () => new LazyDbRepositoryProxy<>(new Lazy<IDbRepository<>(container.GetInstance<>)));

在简单进样器中有可能吗?我只能看到Register的以下替代,这些替代都不允许传入func / instanceCreator:

public void Register(Type openGenericServiceType, params Assembly[] assemblies);
public void Register(Type openGenericServiceType, IEnumerable<Assembly> assemblies);
public void Register(Type openGenericServiceType, Assembly assembly, Lifestyle lifestyle);
public void Register(Type openGenericServiceType, IEnumerable<Assembly> assemblies, Lifestyle);
public void Register(Type openGenericServiceType, IEnumerable<Type> implementationTypes, Lifestyle);
public void Register(Type openGenericServiceType, IEnumerable<Type> implementationTypes);

1 个答案:

答案 0 :(得分:1)

像您建议的那样的代码构造不是您可以在C#中表达的一种。但是,只需对设计进行少量更改,就可以优雅地解决问题。

诀窍是将Container注入您的LazyDbRepositoryProxy<T>中。这样,Simple Injector可以使用自动装配轻松构造新的LazyDbRepositoryProxy<T>实例,从而避免您必须注册委托(不适用于开放通用类型)。

因此,将您的LazyDbRepositoryProxy<T>更改为以下内容:

// As this type depends on your DI library, you should place this type inside your
// Composition Root.
public class LazyDbRepositoryProxy<T> : IDbRepository<T>
{
    private readonly Lazy<DbRepository<T>> wrapped;

    public LazyDbRepositoryProxy(Container container)
    {
        this.wrapped = new Lazy<IMyService>(container.GetInstance<DbRepository<T>>));
    }
}

并按如下所示注册您的类型:

container.Register(typeof(DbRepository<>));
container.Register(typeof(IDbRepository<>), typeof(LazyDbRepositoryProxy<>));