自定义 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)
尝试通过自定义 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)