我要完成的任务:
我想在主项目之外(在外部类库中)保留一些asp.net mvc控制器。将会有一个名为“ DataSync”的ClassLibrary,将来所有的asp.net mvc项目都将引用它。
工作方式:
在“ DataSync”中,我为数据库数据管理创建了自定义DbContext。
//IN DATASYNC PROJECT
public class TrackedDbContextWithIndentity<TUser>: IdentityDbContext<TUser> where TUser : IdentityUser
{
public TrackedDbContextWithIndentity(DbContextOptions<TrackedDbContextWithIndentity<TUser>> options) : base(options)
{
}
public DbSet<DataExchangeInfo> DataExchangeInfo { get; set; }
/// <summary>
/// Modified version of EF SaveChanges method. Runs additional query modifications.
/// </summary>
/// <returns></returns>
public override int SaveChanges()
{
// some modifications to SaveChanges
}
}
想法是,引用“ DataSync” ClassLibrary的项目将具有自己的DbContext类,用于从TrackedDbContextWithIndentity
继承的EntityFramework数据管理。为此,我向我所有项目的数据库中注入了DataExchangeInfo
DbSet和对SaveChanges方法的修改。
我还在“ DataSync” ClassLibrary中保留了一些控制器。这就是我将那些控制器注入到我的项目中的方式:
// IN PROJECT REFERENCING DATASYNC
services.AddMvc(options =>
{
//...
})
// Added WebAPI Controller from DataSync class library
.AddApplicationPart(Assembly.Load(new AssemblyName("DataSync")));
现在,当我启动一个项目时,可以访问在“ DataSync”项目中指定的WebAPI方法。
有什么问题:
假设我要从“ DataSync”中的控制器访问数据库。因为我在“ DataSync”中仅有的DbContext是TrackedDbContextWithIdentity
,所以我正在与其建立连接(没关系,此特定控制器将仅修改TrackedDbContextWithIdentity
中的DbSet)。
//won't compile, TrackedDbContextWithIndentity need to have TUser specified
public class SyncEndpointController : Controller
{
private readonly TrackedDbContextWithIndentity _context;
public SyncEndpointController(TrackedDbContextWithIndentity context)
{
_context = context;
}
//...
}
问题是,TrackedDbContextWithIndentity
需要称为TUser
的泛型类型(因为EntityFramework的类需要IdentityDbContext
)。我无法在SyncEndpointController
中提供它,因为“ DataSync”没有它。 TUser
是一个类,用于指定数据库中特定用户的某些值,并且其配置不同于所有引用“ DataSync”的项目。 “ DataSync”永远不会拥有适合TUser
的类,同时我需要从SyncEndpointController
访问数据库。
我是否可以通过某种方式从引用“ DataSync”到“ DataSync”的项目中传递TUser
泛型类型?还是有其他更好的方法来解决这个问题?