使用实体框架时,将存储库注入控制器是不好的做法吗?
例如,如果我有服务:
public class DogService
{
IMyDbContext _myDbContext;
public DogService(IMyDbContext myDbContext)
{
_myDbContext = myDbContext;
}
public void CreateDog(string name)
{
//create a dog using the myDbContext
}
}
以上是不好的做法,因为我们没有明确处理存储库,并且做得更好:
public void CreateDog(string name, IMyDbContext myDbContext)
{
using(myDbContext)
{
//create a dog using the myDbContext
}
}
mydbcontext的结构:
public class MyDbContext : DbContext, IMyDbContext {}
如何处置myDbContext?
答案 0 :(得分:2)
主要问题 - 使用
DBcontext
注入Dependency Injection
是否是个好主意,如果是,那么它是如何处理的
是的,可以注入,如果使用Ninject IOC
,以下会有所帮助:
kernel.Bind<DBContext>().ToSelf().InRequestScope();
查看以下link,它描述了这两种模式,并提供了有关如何根据DBcontext
创建单HttpRequest
的详细信息,无论在此过程中调用了多少个控制器
答案 1 :(得分:1)
是的,您可以在使用存储库模式时注入存储库接口。我的意思是你可以使用控制器的构造函数注入它。
知识库的生命周期:
所有存储库实例都是Transient。这意味着,它们是按用途实例化的。因此您不必担心上下文的处理。
这是一个示例:这是一个存储库模式。您必须注入存储库的接口。在此示例中,它使用服务层。但您也可以在控制器上执行此操作。
public class PersonAppService : IPersonAppService
{
private readonly IRepository<Person> _personRepository;
public PersonAppService(IRepository<Person> personRepository)
{
_personRepository = personRepository;
}
public void CreatePerson(CreatePersonInput input)
{
person = new Person { Name = input.Name, EmailAddress = input.EmailAddress };
_personRepository.Insert(person);
}
}
您可以在此处详细了解:Repositories
答案 2 :(得分:-2)
你可以让DogService实现IDisposable并从DogService的Dispose方法调用myDbContext.Dispose()。