Nhibernate 自定义IConnectionProvider如何成为;注入;需要依赖关系吗?

Nhibernate 自定义IConnectionProvider如何成为;注入;需要依赖关系吗?,nhibernate,Nhibernate,正在尝试将依赖项注入用于自定义NHibernate实现类,特别是IConnectionProvider。问题是我需要我的IConnectionProvider实现来使用一些依赖组件(.NETDI术语中的“服务”)。如果提供者是由DI容器管理的,那么我只需要将依赖项构造函数参数设置为args,然后就可以完成了 例如: public class MyConnectionProvider : ConnectionProvider
 { public MyConnectionProvider(

正在尝试将依赖项注入用于自定义NHibernate实现类,特别是
IConnectionProvider
。问题是我需要我的
IConnectionProvider
实现来使用一些依赖组件(.NETDI术语中的“服务”)。如果提供者是由DI容器管理的,那么我只需要将依赖项构造函数参数设置为args,然后就可以完成了

例如:

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感知。我如何制作这样的定制impl,它需要由DI容器管理的协作服务?

关键是实现NHibernate接口。Autofac、Spring和Castle Windsor有一些DI感知的实现(讨论和讨论)。最后,我为Microsoft默认DI编写了一个实现,如下所示

公共类MicrosoftDIObjectsFactory:IOObjectsFactory
{
私人懒惰sp;
公共MicrosoftDIObjectsFactory(Func serviceProviderProvider)
{
sp=新延迟(serviceProviderProvider);
}
公共对象CreateInstance(类型)
{
对象实例=sp.Value.GetService(类型);
如果(instance!=null){return instance;}
返回Activator.CreateInstance(类型);
}
}
添加不可解析类型的缓存以提高性能非常容易(避免在
IServiceProvider
中重复查找)

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

Environment.ObjectsFactory = new MicrosoftDIObjectsFactory(services.BuildServiceProvider)

关键是实现NHibernate接口。Autofac、Spring和Castle Windsor(讨论和讨论)都有一些DI感知的实现。最后,我为Microsoft默认DI编写了一个实现,如下所示

公共类MicrosoftDIObjectsFactory:IOObjectsFactory
{
私人懒惰sp;
公共MicrosoftDIObjectsFactory(Func serviceProviderProvider)
{
sp=新延迟(serviceProviderProvider);
}
公共对象CreateInstance(类型)
{
对象实例=sp.Value.GetService(类型);
如果(instance!=null){return instance;}
返回Activator.CreateInstance(类型);
}
}
添加不可解析类型的缓存以提高性能非常容易(避免在
IServiceProvider
中重复查找)

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

Environment.ObjectsFactory = new MicrosoftDIObjectsFactory(services.BuildServiceProvider)