我正在使用ASP.NET WebAPI 2& EF6是一个非常小的项目,利用AutoFac将我的DbContext直接注入我的控制器。根据Ryan的回答,我不使用存储库模式:NOT using repository pattern, use the ORM as is (EF)。为了执行注入,我继续创建了一个如下界面:
public interface IMoveGroupEntities : IDisposable
{
System.Data.Entity.DbSet<HostEntry> HostEntries { get; set; }
DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
Task<int> SaveChangesAsync();
}
然后在部分类上实现了接口,该部分类与我生成的实体一起使用,如下所示:
public partial class MoveGroupEntities : IMoveGroupEntities
{
}
我有一种潜在的怀疑,我在这里做错了,因为我觉得这句话:
DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
不应该需要,但它似乎是必要的,因为&#34;条目&#34;在我的脚手架API控制器中使用。
任何人都可以通过更好的方式来实现这一目标吗?
答案 0 :(得分:1)
关于脚手架代码,你能说的最好的是:它有效。它在架构上不是最好的代码。我完全同意你引用的链接,但这并不意味着控制器应该直接与EF工件联系(包括Entry
)。
我认为用另一个包装器替换一个DbSet
包装器(存储库)是错误的。 answer的要点是:在代码中直接使用上下文(和DbSet
等)。那就是:不要使用包装纸。那是不:在任何地方使用上下文(等) 。你完全相反:你创建了一个不同类型的包装器,以便在任何地方使用EF。但是,你的直觉并不是真的很好。
我总是喜欢保持动作方法(MVC,Web API)小。基本上,我只是让他们调用一种服务方法。它是处理上下文和EF必须提供的所有内容的服务。这些服务可以在一个单独的程序集中,但无论它们在哪里,它们都通过依赖注入注入控制器,同样,它们通过DI获得它们的上下文。