【问题标题】:Unable to resolve dependency for generic repository using autofac无法使用 autofac 解决通用存储库的依赖关系
【发布时间】:2019-08-14 04:44:37
【问题描述】:

我正在使用 .net 核心 API 并使用 autofac 解决我的依赖关系。但是不知何故,我无法解决我的通用存储库的依赖关系。

有人可以指导我做错了什么。

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

    }
}

代码有什么问题吗?我能够解决我的其他存储库和服务,只是面临通用存储库的问题 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 = Repository1 (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 ---> '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.) ---&gt; Autofac.Core.DependencyResolutionException: An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = Repository1 (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 ---&gt; No constructors on type 'MakeTalk.Data.Infrastructure.Repository1[MakeTalk.Model.ExhibitionRequestStatus] ' 可以通过构造函数查找器 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' 找到。 (有关详细信息,请参阅内部异常。)---> Autofac.Core.DependencyResolutionException:'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, IEnumerable1 参数类型上没有构造函数) 在 Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 parameters) --- End of inner exception stack trace --- at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 参数) 在 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, IEnumerable1 参数) 在 Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate() 在 Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext 上下文,IEnumerable1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 参数) --- 内部异常堆栈跟踪结束 --- 在 Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 parameters) at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func1 创建者) 在 Autofac.Core.Resolving.InstanceLookup.Execute() 在 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope,IComponentRegistration 注册,IEnumerable1 parameters) at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable1 参数) 在 Autofac.ResolutionExtensions.TryResolveService(IComponentContext 上下文,服务服务,IEnumerable1 parameters, Object& instance) at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable1 参数) 在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,类型类型,类型 requiredBy,布尔 isDefaultParameterRequired) 在 lambda_method(闭包,IServiceProvider,对象 []) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.c__DisplayClass4_0.b__0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.c__DisplayClass5_0.g__CreateController|0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(状态&下一个,范围&范围,对象&状态,布尔& isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext 上下文) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(状态&下一个,范围&范围,对象&状态,布尔& isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() 在 Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext) 在 Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)

【问题讨论】:

    标签: c# asp.net-core autofac asp.net-core-webapi


    【解决方案1】:

    如果您查看错误消息,您可以看到这个

    无法使用构造函数查找器Autofac.Core.Activators.Reflection.DefaultConstructorFinder 找到类型为MakeTalk.Data.Infrastructure.Repository1[MakeTalk.Model.ExhibitionRequestStatus] 的构造函数。

    这意味着 Autofac 在类型 Repository&lt;T&gt; 上找不到构造函数。如果您查看此类型,则构造函数被标记为protected,这意味着 Autofac 无法访问它。

    要修复此错误,您必须将构造函数更改为 public

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 2021-12-26
      • 2022-11-19
      • 2020-06-04
      相关资源
      最近更新 更多