Autofac解析以接口为参数的泛型类型

本文关键字:参数 泛型类型 接口 Autofac | 更新日期: 2023-09-27 18:25:12

我正在尝试在Autofac中注册/解析一个泛型类型,该类型接收类型param,这是一个接口,也已经注册。

我有以下内容:

public interface IBaseEntity
{
}
public partial interface IRepository<T>
    where T : IBaseEntity
{
}
public class NhRepository<T> : IRepository<T>
    where T : IBaseEntity
{
}
public interface IEntity : IBaseEntity
{
} 
public class Entity : IEntity
{
}

注册:

//registering type    
builder.RegisterType<Entity>().As<IEntity>();
//registering generic type in Autofac
builder.RegisterGeneric(typeof(NhRepository<>))
    .As(typeof(IRepository<>)).InstancePerRequest();

尝试解决:

//the code below returns NhRepository<IEntity>().
_containerManager.Resolve<IRepository<IEntity>>();

我想要一种方法来获得NhRepositoy<Entity>而不是NhRepository<IEntity>()

知道吗?

Autofac解析以接口为参数的泛型类型

我遇到了类似的问题,很可能是因为与您遇到的原因相同,即实体框架无法使用接口。我使用Autofac的OnActivating方法解决了这个问题。请参阅此处的文档,查找类型,然后在新实例中调用一个方法来设置类型。

查看OnActivating文档,它们显示了一个使用新实例替换实例的情况,这正是您想要的。要创建新实例,您需要做两件事:

  1. 解析IEntity-to-Entity类
  2. 自己创建Generic类

第一个问题的答案在我的stackoverflow帖子中,所以我不在这里重复了。

第二个相当简单。您需要使用.NET MakeGenericType方法来创建类,在您的情况下,代码应该是类似的。

e.ReplaceInstance(typeof(NhRepository<>).MakeGenericType( new []{resolvedType}));

其中CCD_ 6被来自我的解决方案的命令CCD_。希望这是有道理的。