Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储库应该通过构造函数注入还是包装在using中?_C#_.net_Entity Framework_Visual Studio 2015 - Fatal编程技术网

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%确定