我有一部分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);
}
}
}
答案 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: