如何使用Autofac注册通用接口的通用实现
本文关键字:实现 接口 何使用 注册 Autofac | 更新日期: 2023-09-27 18:08:37
我正在尝试使用Autofac注册我的存储库,但我有一个问题。下面是我到目前为止生成的内容:
ContainerModule.cs
public class ContainerModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<XmlDataProvider>().As<IDataProvider>();
builder.RegisterGeneric(typeof (TemplateRepository<,>)).As(typeof (IRepository<>)).SingleInstance();
}
}
TemplateRepository {T}。cs
public class TemplateRepository<TTemplate, TEntity> : IRepository<TTemplate> where TTemplate : ITemplate
{
public TemplateRepository(IDataProvider dataProvider)
{
}
}
[当我试图解决它的地方]
var markerRepository = container.Resolve<IRepository<MarkerTemplate>>();
问题是,Autofac甚至不尝试构建我的存储库(我把那里的断点,它从来没有击中)。我收到以下异常:
类型为"autoface . core . registration"的异常。componentnoregisteredexception '在autoface .dll中发生,但未在用户代码中处理附加信息:请求的服务'*********. logic . web . repository . irepository ' 1[[*********. template。MarkerTemplate , *********. 逻辑。Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'尚未注册。要避免这种异常,要么注册一个组件来提供服务,要么使用IsRegistered()检查服务注册,要么使用ResolveOptional()方法来解析可选依赖项。
我试图将我的注册代码更改为更具体的东西,但是,我收到另一个异常说,TEntity
不是开放接口。
我尝试了这里找到的几个解决方案,但这些都不起作用。你知道为什么我不能登记这样的案件吗?
您有一个泛型实现,它有两个泛型类型参数,并且您将其注册为具有一个泛型类型参数的接口。您认为Autofac将如何确定您的实现泛型(TEntity)的第二个类型参数?
我有这个,它完美地工作:
public class RavenRepository<T> : IRepository<T> where T : Entity
...
builder.RegisterGeneric(typeof (RavenRepository<>))
.AsSelf()
.AsImplementedInterfaces()
.InstancePerRequest();