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