[英]Unable to resolve keyed generic parameter of registered type using Autofac
[英]Unable to resolve dependency for generic repository using autofac
我正在使用.net核心API并使用autofac解析我的依赖项。 但是不知怎的,我无法解决我的Generic Repository的依赖关系。
有人可以指导我做错了什么。
startup.cs
var builder = new ContainerBuilder();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>()
.InstancePerLifetimeScope();
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>()
.InstancePerLifetimeScope();
//This is the place which is not working for me
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerLifetimeScope();
builder.RegisterAssemblyTypes(typeof(SizeRepository).Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
builder.RegisterAssemblyTypes(typeof(UserService).Assembly)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
builder.Populate(services);
var container = builder.Build();
//Create the IServiceProvider based on the container.
return new AutofacServiceProvider(container);
UnitOfWork.cs
using System.Threading.Tasks;
namespace MakeTalk.Data.Infrastructure
{
public class UnitOfWork : IUnitOfWork
{
#region Local variable
private readonly IDatabaseFactory databaseFactory;
private MakeTalkEntities dataContext;
#endregion
#region Constructor
public UnitOfWork(IDatabaseFactory databaseFactory)
{
this.databaseFactory = databaseFactory;
}
#endregion
#region Property
protected MakeTalkEntities DataContext => dataContext ?? (dataContext = databaseFactory.Get());
#endregion
#region Methods
/// <summary>
/// Commit changes
/// </summary>
/// <history>Created : 01-04-2018</history>
public void Commit()
{
DataContext.SaveChanges();
}
/// <summary>
/// Commit Async changes
/// </summary>
/// <returns></returns>
/// <history>Created : 01-04-2018</history>
public async Task<int> CommitAsync()
{
return await DataContext.SaveChangesAsync();
}
#endregion
}
}
Repository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
namespace MakeTalk.Data.Infrastructure
{
public class Repository<T> : IRepository<T> where T : class
{
#region Variable / Properties
private MakeTalkEntities dataContext;
private readonly DbSet<T> dbSet;
protected MakeTalkEntities DataContext => dataContext ?? (dataContext = DatabaseFactory.Get());
protected IDatabaseFactory DatabaseFactory
{
get;
private set;
}
#endregion
#region Constructor
protected Repository(IDatabaseFactory databaseFactory)
{
DatabaseFactory = databaseFactory;
dbSet = DataContext.Set<T>();
}
#endregion
#region Sync Methods
// all methods ...
#endregion
}
}
DatabaseFactory.cs
using Microsoft.EntityFrameworkCore;
namespace MakeTalk.Data.Infrastructure
{
public class DatabaseFactory : Disposable, IDatabaseFactory
{
private MakeTalkEntities dataContext;
public MakeTalkEntities Get()
{
return dataContext ?? (dataContext = new MakeTalkEntities(new DbContextOptions<MakeTalkEntities>()));
}
protected override void DisposeCore()
{
dataContext?.Dispose();
}
}
}
MakeTalkEntities.cs
using Microsoft.EntityFrameworkCore;
using MakeTalk.Data.Configuration;
using MakeTalk.Model;
namespace MakeTalk.Data
{
public class MakeTalkEntities : DbContext
{
#region Constructor
public MakeTalkEntities(DbContextOptions options)
{
}
#endregion
#region DB Properties
// db sets
#endregion
#region Methods
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// ReSharper disable once AssignNullToNotNullAttribute
optionsBuilder.UseSqlServer("Some-Connection");
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// all configutaion
base.OnModelCreating(modelBuilder);
}
#endregion
}
}
代码有什么问题吗? 我能解析我的其他存储库和服务,只是面临Generic Repository builder.RegisterGeneric(typeof(Repository <>))的问题.As(typeof(IRepository <>))。InstancePerLifetimeScope();
在使用此通用存储库时,我收到以下错误
Autofac.Core.DependencyResolutionException:激活特定注册期间发生错误。 有关详细信息,请参阅内部异常 注册:Activator = CommonService(ReflectionActivator),Services = [MakeTalk.Service.ICommonService],Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,Sharing = Shared,Ownership = OwnedByLifetimeScope --->在激活特定注册期间发生错误。 有关详细信息,请参阅内部异常 注册:Activator = Repository
1 (ReflectionActivator), Services = [MakeTalk.Data.Infrastructure.IRepository
1 [[MakeTalk.Model.ExhibitionRequestStatus,MakeTalk.Model,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,Sharing = Shared,Ownership = OwnedByLifetimeScope --->没有类型'MakeTalk.Data.Infrastructure.Repository1[MakeTalk.Model.ExhibitionRequestStatus]' can be found with the constructor finder 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'. (See inner exception for details.) (See inner exception for details.) ---> Autofac.Core.DependencyResolutionException: An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = Repository
1[MakeTalk.Model.ExhibitionRequestStatus]' can be found with the constructor finder 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'. (See inner exception for details.) (See inner exception for details.) ---> Autofac.Core.DependencyResolutionException: An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = Repository
1[MakeTalk.Model.ExhibitionRequestStatus]' can be found with the constructor finder 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'. (See inner exception for details.) (See inner exception for details.) ---> Autofac.Core.DependencyResolutionException: An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = Repository
1(ReflectionActivator),Services = [MakeTalk.Data.Infrastructure.IRepository1[[MakeTalk.Model.ExhibitionRequestStatus, MakeTalk.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> No constructors on type 'MakeTalk.Data.Infrastructure.Repository
1 [MakeTalk.Model.ExhibitionRequestStatus]'的构造函数可以在构造函数查找器中找到' Autofac.Core.Activators.Reflection.DefaultConstructorFinder”。 (有关详细信息,请参阅内部异常。)---> Autofac.Core.DependencyResolutionException:1[MakeTalk.Model.ExhibitionRequestStatus]' can be found with the constructor finder 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'. at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable
类型'MakeTalk.Data.Infrastructure.Repository1[MakeTalk.Model.ExhibitionRequestStatus]' can be found with the constructor finder 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'. at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable
1[MakeTalk.Model.ExhibitionRequestStatus]' can be found with the constructor finder 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'. at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable
1参数)在Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 parameters) --- End of inner exception stack trace --- at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable
)中的Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id,Func1 creator) at Autofac.Core.Resolving.InstanceLookup.Execute() at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable
1 parameters) --- End of inner exception stack trace --- at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable
1个参数)1 creator) at Autofac.Core.Resolving.InstanceLookup.Execute() at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable
1参数)位于Autofac的Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()中的Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext上下文,IEnumerable1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable
1参数)---内部异常堆栈跟踪结束---在Autofac.Core.Resolving.InstanceLookup.Act ivate(IEnumerable1 parameters) at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func
1创建者),Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope,在Autofac.ResolutionExtensions的Autofac.ResolutionExtensions.TryResolveService(IComponentContext上下文,服务服务,IEnumerable1 parameters, Object& instance) at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable
1 parameters) at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable
1参数)中的1 parameters) at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable
1参数1 parameters, Object& instance) at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable
Microsoft.AspNetCore的lambda_method(Closure,IServiceProvider,Object [])上的Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired)中的1 parameters, Object& instance) at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable
1参数) .Mvc.Controllers.ControllerActivatorProvider。< > c__DisplayClass4_0.b__0(ControllerContext controllerContext)at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider。<> c__DisplayClass5_0.g__CreateController | 0(ControllerContext controllerContext)at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State&next,Scope&scope,Object&在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()中的Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()处于Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)中的state,Boolean&isCompleted) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync中的Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State&next,Scope&scope,Object&state,Boolean&isCompleted)at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()Microsoft.AspNetCore.Routing.EndpointRoutingMi上的Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)中的ddleware.Invoke(HttpContext httpContext)
如果您查看错误消息,您可以看到这一点
使用构造函数查找器
Autofac.Core.Activators.Reflection.DefaultConstructorFinder
可以找到类型MakeTalk.Data.Infrastructure.Repository1[MakeTalk.Model.ExhibitionRequestStatus]
上的构造Autofac.Core.Activators.Reflection.DefaultConstructorFinder
。
这意味着Autofac无法在Repository<T>
类型上找到构造函数。 如果您查看此类型,构造函数将标记为protected
,这意味着Autofac无权访问它。
要修复此错误,您必须将构造函数更改为public
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.