我正在尝试使用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
不是开放界面。
我尝试了几种解决方案,但这些解决方案都没有效果。你知道为什么我不能注册这样的案子吗?
答案 0 :(得分:2)
您有一个具有两个泛型类型参数的泛型实现,并将其注册为具有一个泛型类型参数的接口。您如何看待Autofac将找出您的实现通用(TEntity)的第二个类型参数?
我有这个,它完美无缺:
public class RavenRepository<T> : IRepository<T> where T : Entity
...
builder.RegisterGeneric(typeof (RavenRepository<>))
.AsSelf()
.AsImplementedInterfaces()
.InstancePerRequest();