应该通过构造函数注入存储库还是包含在使用中?

时间:2016-09-26 18:15:56

标签: c# .net entity-framework visual-studio-2015

使用实体框架时,将存储库注入控制器是不好的做法吗?

例如,如果我有服务:

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?

3 个答案:

答案 0 :(得分:2)

  

主要问题 - 使用DBcontext注入Dependency Injection是否是个好主意,如果是,那么它是如何处理的

是的,可以注入,如果使用Ninject IOC,以下会有所帮助:

kernel.Bind<DBContext>().ToSelf().InRequestScope();

查看以下link,它描述了这两种模式,并提供了有关如何根据DBcontext创建单HttpRequest的详细信息,无论在此过程中调用了多少个控制器

另一个有用的链接How to handle DBContext when using Ninject

答案 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()。