使用 Simple Injector 注册泛型类型的实例创建者
Register instance creator for generic type with Simple Injector
我在 Simple Injector 中有以下配置:
c.Register<IQueryable<Entity1>>(() => c.GetInstance<IDomainQueryFactory>().Query<Entity1>());
c.Register<IQueryable<Entity2>>(() => c.GetInstance<IDomainQueryFactory>().Query<Entity2>());
c.Register<IQueryable<Entity3>>(() => c.GetInstance<IDomainQueryFactory>().Query<Entity3>());
c.Register<IQueryable<Entity4>>(() => c.GetInstance<IDomainQueryFactory>().Query<Entity4>());
...
IDomainQueryFactory
工厂负责创建 IQueryable<TEntity>
的实例。某些 class(如 MVC 控制器)然后仅声明对 IQueryable<Entity1>
.
的依赖
我想知道是否有某种方法可以用一条命令编写这些注册。
没有办法做到这一点,因为 Simple Injector 更喜欢使用类型而不是功能组合。这意味着 Simple Injector 并不容易让您注册一个泛型方法以在注册过程中使用,就像您可以使用泛型类型一样。
因此,为了减少样板代码的数量并避免必须更新每个新实体的配置,您将必须创建一个通用的 IQueryable<T>
实现并注册它。这是这个实现的样子:
public sealed class DomainQueryFactoryQueryable<T> : IQueryable<T>
{
private readonly IDomainQueryFactory factory;
public DomainQueryFactoryQueryable(IDomainQueryFactory factory) {
this.factory = factory;
}
public Type ElementType { get { return this.GetQuery().ElementType; } }
public Expression Expression { get { return this.GetQuery().Expression; } }
public IQueryProvider Provider { get { return this.GetQuery().Provider; } }
public IEnumerator<T> GetEnumerator() {
return this.GetQuery().GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return this.GetEnumerator();
}
private IQueryable<T> GetQuery() {
return this.factory.Query<T>();
}
}
您可以通过以下方式注册:
container.RegisterOpenGeneric(typeof(IQueryable<>), typeof(DomainQueryFactoryQueryable<>));
我在 Simple Injector 中有以下配置:
c.Register<IQueryable<Entity1>>(() => c.GetInstance<IDomainQueryFactory>().Query<Entity1>());
c.Register<IQueryable<Entity2>>(() => c.GetInstance<IDomainQueryFactory>().Query<Entity2>());
c.Register<IQueryable<Entity3>>(() => c.GetInstance<IDomainQueryFactory>().Query<Entity3>());
c.Register<IQueryable<Entity4>>(() => c.GetInstance<IDomainQueryFactory>().Query<Entity4>());
...
IDomainQueryFactory
工厂负责创建 IQueryable<TEntity>
的实例。某些 class(如 MVC 控制器)然后仅声明对 IQueryable<Entity1>
.
我想知道是否有某种方法可以用一条命令编写这些注册。
没有办法做到这一点,因为 Simple Injector 更喜欢使用类型而不是功能组合。这意味着 Simple Injector 并不容易让您注册一个泛型方法以在注册过程中使用,就像您可以使用泛型类型一样。
因此,为了减少样板代码的数量并避免必须更新每个新实体的配置,您将必须创建一个通用的 IQueryable<T>
实现并注册它。这是这个实现的样子:
public sealed class DomainQueryFactoryQueryable<T> : IQueryable<T>
{
private readonly IDomainQueryFactory factory;
public DomainQueryFactoryQueryable(IDomainQueryFactory factory) {
this.factory = factory;
}
public Type ElementType { get { return this.GetQuery().ElementType; } }
public Expression Expression { get { return this.GetQuery().Expression; } }
public IQueryProvider Provider { get { return this.GetQuery().Provider; } }
public IEnumerator<T> GetEnumerator() {
return this.GetQuery().GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return this.GetEnumerator();
}
private IQueryable<T> GetQuery() {
return this.factory.Query<T>();
}
}
您可以通过以下方式注册:
container.RegisterOpenGeneric(typeof(IQueryable<>), typeof(DomainQueryFactoryQueryable<>));