自定义 IConnectionProvider 如何 "injected" 具有所需的依赖项?

How can a custom IConnectionProvider be "injected" with required dependencies?

尝试通过自定义 NHibernate 实现使用依赖注入 类,特别是 IConnectionProvider。问题是我需要 IConnectionProvider 的实现来使用一些依赖组件(.Net DI 术语中的“服务”)。如果提供程序由 DI 容器管理,我将只创建依赖项构造函数参数并完成。

例如:

public class MyConnectionProvider : ConnectionProvider
 {

    public MyConnectionProvider(IServiceA serviceA, IServiceB serviceB) {
        this.serviceA = serviceA;
        this.serviceB = serviceB;
    }

    public override DbConnection GetConnection() {
        // Use serviceA and serviceB to return a DbConnection...
    }
}

但是 NHibernate 实例化 IConnectionProvider 之类的机制是反射,而不是 DI 感知。如何制作这样的自定义实现,它需要由 DI 容器管理的协作服务?

关键是实现 NHibernate 接口 IObjectsFactory There are some DI-aware implementations of that for Autofac, Spring, and Castle Windsor (discussed here and here)。我最终为 Microsoft 默认 DI 编写了一个实现,如下所示

public class MicrosoftDIObjectsFactory : IObjectsFactory
{
    private Lazy<IServiceProvider> sp;

    public MicrosoftDIObjectsFactory(Func<IServiceProvider> serviceProviderProvider)
    {
        sp = new Lazy<IServiceProvider>(serviceProviderProvider);
    }

    public object CreateInstance(Type type)
    {
        object instance = sp.Value.GetService(type);
        if (instance != null) { return instance; }

        return Activator.CreateInstance(type);
    }
}

添加 un-resolvable 类型的缓存以提高性能非常容易(避免在 IServiceProvider 中重复查找)。

为了进行设置,在 IServiceCollection 初始化期间,我使用了如下代码:

Environment.ObjectsFactory = new MicrosoftDIObjectsFactory(services.BuildServiceProvider)