无法解析类型' Core.Data.CoreContext'在尝试激活Core.Data.Repositories.UnitOfWork'

时间:2017-08-24 09:47:00

标签: dependency-injection asp.net-core projects-and-solutions

我有一部分WebAPI应用程序,我想将其作为类库移动到单独的项目中。 这是常见的基础结构,几乎每个应用程序都有这样的想法,以使其易于共享。 申请类型是: ASP.NET核心Web应用程序/ .NET Framework - ASP.NET Core 2.0 / Web API

我在这个方向上所做的是创建了一个名为Core的项目,并在那里移动了那些共享元素,包括基本实体(例如用户,设置等),CoreContext,UnitOfWork,Generic Repository,BaseRepositories,......

在app的主项目中,有其他实体,继承CoreContext的AppContext,更多存储库和所有控制器,......

我能够构建应用程序,但在启动时会出现以下错误:

  

InvalidOperationException:无法解析类型' Core.Data.CoreContext'的服务。在尝试激活Core.Data.Repositories.UnitOfWork'。

时      

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(类型   serviceType,Type implementationType,ISet callSiteChain,   ParameterInfo []参数,bool throwIfCallSiteNotFound)...

问题似乎是UnitOfWork类在Core项目中,而Main项目是Startup.cs,方法ConfigureServices具有services.AddTransient<IUnitOfWork, UnitOfWork>();

这是一个错误还是我只是没有正确配置?如果可能的话,如何实现呢?

*更多技术细节:
NetCore&amp; EF核心版:2.0
数据库提供程序:Microsoft.EntityFrameworkCore.SqlServer
IDE:Visual Studio 2017 15.3
操作系统:Windows 10

更新:代码示例

namespace Main
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().Build();
    }
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<IUnitOfWork, UnitOfWork>();
            services.AddMvc();
            var conn = Configuration.GetConnectionString("DefaultConnection"); 
            services.AddDbContext<AppContext>(options => options.UseSqlServer(conn));
        }
    }
}

namespace Main.Data
{
    public class AppContext : CoreContext
    {
        ...
    }
}

-

namespace Core.Data
{
    public class UnitOfWork : IUnitOfWork, IDisposable
    {
        public CoreContext context;

        public UnitOfWork(CoreContext context)
        {
            this.context = context;
        }

        public T Get<T>() where T : BaseRepository, new()
        {
            var repository = new T();
            repository.Init(context);
            return repository;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

public class UnitOfWork<TContext> : IUnitOfWork, IDisposable
    where TContext : CoreContext
{
   public UnitOfWork(TContext ctx) { ... }
   ...
}

-

public class AppUnitOfWork : UnitOfWork<AppContext> { 
    public AppUnitOfWork(AppContext ctx) : base(ctx) { }
}
...
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
       ...
        services.AddTransient<IUnitOfWork, AppUnitOfWork>(); // Note the App prefix
        services.AddDbContext<AppContext>(options => options.UseSqlServer(conn)); // Note the App prefix
    }
    ...
}

解决方案来自GitHub issue