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的OnActivating
方法解决了这个问题。请参阅此处的文档,查找类型,然后在新实例中调用一个方法来设置类型。
查看OnActivating
文档,它们显示了一个使用新实例替换实例的情况,这正是您想要的。要创建新实例,您需要做两件事:
- 解析IEntity-to-Entity类
- 自己创建Generic类
第一个问题的答案在我的stackoverflow帖子中,所以我不在这里重复了。
第二个相当简单。您需要使用.NET MakeGenericType
方法来创建类,在您的情况下,代码应该是类似的。
e.ReplaceInstance(typeof(NhRepository<>).MakeGenericType( new []{resolvedType}));
其中CCD_ 6被来自我的解决方案的命令CCD_。希望这是有道理的。