C# 存储库应该通过构造函数注入还是包装在using中?
在使用实体框架时,将存储库注入控制器是一种不好的做法吗 例如,如果我有一项服务:C# 存储库应该通过构造函数注入还是包装在using中?,c#,.net,entity-framework,visual-studio-2015,C#,.net,Entity Framework,Visual Studio 2015,在使用实体框架时,将存储库注入控制器是一种不好的做法吗 例如,如果我有一项服务: public class DogService { IMyDbContext _myDbContext; public DogService(IMyDbContext myDbContext) { _myDbContext = myDbContext; } public void CreateDog(string name) {
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?是的,使用存储库模式时可以插入存储库接口。我的意思是你可以使用控制器的构造函数注入它 存储库的生存期: 所有存储库实例都是暂时的。这意味着,它们是按使用情况实例化的,因此您不需要担心上下文的处理 下面是一个示例:这是一个存储库模式。您必须注入存储库的接口。在这个示例中,它使用服务层。但您也可以在控制器上这样做
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);
}
}
公共类PersonAppService:IPersonAppService
{
私人只读IRepository\u personRepository;
公共人物服务(IRepository personRepository)
{
_personRepository=personRepository;
}
public void CreatePerson(CreatePersonInput输入)
{
person=newperson{Name=input.Name,EmailAddress=input.EmailAddress};
_personRepository.Insert(person);
}
}
您可以在这里了解更多信息:您可以让DogService实现IDisposable,并从DogService的Dispose方法调用myDbContext.Dispose() 主要问题-使用
依赖项注入注入DBcontext
是否是一个好主意,如果是,那么如何处理它
是的,如果使用Ninject-IOC
,则可以注入,以下内容将有所帮助:
kernel.Bind<DBContext>().ToSelf().InRequestScope();
kernel.Bind().ToSelf().InRequestScope();
查看以下内容,它描述了这两种模式,并提供了有关如何根据HttpRequest
创建单个DBcontext
的详细信息,而不管在该过程中调用了多少个控制器
另一个有用的链接,您通常不会“注入”上下文。创建、使用和销毁上下文。更常见的情况是,注入一个存储库或其他东西,然后使用上下文。非常感谢我更新了这个问题来回答另一个问题,创建一次性对象的东西通常负责处理它。当您将其注入另一个类时,它会使事情变得复杂。@DStanley这是否意味着只要创建存储库的对象被释放,我的连接就会被释放?仅当创建它的对象在Dispose
方法中释放它时。谁将调用该Dispose?@MrinalKamboj将通过创建using块中的DogService实例:您还不了解依赖项注入及其工作原理。在这种情况下,如果可行的话,OP会做这么长时间的备份。请不要使用内联代码来突出显示随机编程相关术语。它不会让你的帖子更具可读性,甚至相反。另请参见。@CodeCaster好的,当然,谢谢。我想这是你第二次给出这样的建议。我会在下面继续:)当然不仅仅是Ninject。生命周期管理成为DI容器的责任。@HenkHolterman理想地同意这一点,但由于有如此多的DI框架四处飘荡,我对一个笼统的主张几乎没有什么不同,就像我使用过的Ninject一样,所以100%确定