如何使用Autofac注册通用接口的通用实现?

时间:2015-08-18 16:56:09

标签: c# generics inversion-of-control autofac

我正在尝试使用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横置的.cs

public class TemplateRepository<TTemplate, TEntity> : IRepository<TTemplate> where TTemplate : ITemplate
{
    public TemplateRepository(IDataProvider dataProvider)
    {
    }
}

[当我尝试解决时的位置]

 var markerRepository = container.Resolve<IRepository<MarkerTemplate>>();

问题是,Autofac甚至没有尝试构建我的存储库(我放置断点并且它从未被击中)。我收到以下异常:

  

Autofac.dll中出现“Autofac.Core.Registration.ComponentNotRegisteredException”类型的异常,但未在用户代码中处理   附加信息:请求的服务'*********.Logic.Web.Repository.IRepository`1 [[*********.Template.MarkerTemplate,******** * .Logic.Web,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'尚未注册。要避免此异常,请注册组件以提供服务,使用IsRegistered()检查服务注册,或使用ResolveOptional()方法解析可选依赖项。

我尝试将注册码更改为更具体的注册码,但接着又说了一个例外,TEntity不是开放界面。

我尝试了几种解决方案,但这些解决方案都没有效果。你知道为什么我不能注册这样的案子吗?

1 个答案:

答案 0 :(得分:2)

您有一个具有两个泛型类型参数的泛型实现,并将其注册为具有一个泛型类型参数的接口。您如何看待Autofac将找出您的实现通用(TEntity)的第二个类型参数?

我有这个,它完美无缺:

public class RavenRepository<T> : IRepository<T> where T : Entity

...

builder.RegisterGeneric(typeof (RavenRepository<>))
    .AsSelf()
    .AsImplementedInterfaces()
    .InstancePerRequest();