如何使用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注册通用接口的通用实现

您有一个泛型实现,它有两个泛型类型参数,并且您将其注册为具有一个泛型类型参数的接口。您认为Autofac将如何确定您的实现泛型(TEntity)的第二个类型参数?

我有这个,它完美地工作:

public class RavenRepository<T> : IRepository<T> where T : Entity
...
builder.RegisterGeneric(typeof (RavenRepository<>))
    .AsSelf()
    .AsImplementedInterfaces()
    .InstancePerRequest();