【发布时间】:2015-05-05 02:02:09
【问题描述】:
由于Mark Seemann 的这句话,我可能正在完成一项不可能完成的任务:
如果您有特定的 ORM,请明确说明。别 将其隐藏在界面后面。它创造了一种错觉,你可以 用另一种实现替换。在实践中,这是 不可能的。
但我想要完成的是通过更改我在启动时的依赖项来使用 MongoDb 驱动程序切换我的实体框架 ORM。
但我一直遇到一些问题,即我没有提供足够的灵活性,或者只是在我的 MongoDb 实现中拥有太多 new NotImplementedException();。
我的接口当前结构如下所示:
public interface IReadEntities
{
IQueryable<TEntity> Query<TEntity>() where TEntity : Entity;
}
public interface IWriteEntities : IUnitOfWork, IReadEntities
{
TEntity Get<TEntity>(object firstKeyValue, params object[] otherKeyValues) where TEntity : Entity;
Task<TEntity> GetAsync<TEntity>(object firstKeyValue, params object[] otherKeyValues) where TEntity : Entity;
IQueryable<TEntity> Get<TEntity>() where TEntity : Entity;
void Create<TEntity>(TEntity entity) where TEntity : Entity;
void Delete<TEntity>(TEntity entity) where TEntity : Entity;
void Update<TEntity>(TEntity entity) where TEntity : Entity;
}
public interface IUnitOfWork
{
int SaveChanges();
Task<int> SaveChangesAsync();
Task DiscardChangesAsync();
void DiscardChanges();
void Reload<TEntity>(TEntity entity) where TEntity : Entity;
Task ReloadAsync<TEntity>(TEntity entity) where TEntity : Entity;
}
但是通过这个实现,我已经无法完成“完整”的 MongoDb 实现,因为 MongoDb 不使用工作单元模式或两阶段提交。
然后我想将IUnitOfWork 移动到IWriteEntities 的扩展方法中,但后来我失去了连接到实体框架实现的DbContext,我不会在静态方法中使用服务定位器模式.
所以我最后的手段,就是问有没有我还没有尝试过的黄金之路?或者我应该简单地再创建两个接口:
public interface IEntityFrameworkWriter : IWriteEntities, IUnitOfWork {} // Move IUnitOfWork out of IWriteEntities
public interface IMongoDbWriter : IWriteEntities {}
并在我的应用程序中使用这些。但话又说回来,这不是我计划的。感谢您提供任何反馈。
爆头
【问题讨论】:
标签: c# entity-framework mongodb dependency-injection abstraction