2016-09-26 51 views
3

當使用實體框架時,將資源庫注入控制器是不好的做法嗎?應該通過構造函數注入一個存儲庫還是使用?

例如,如果我有一個服務:

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的stucture:

public class MyDbContext : DbContext, IMyDbContext {} 

如何處置myDbContext?

+2

你通常不會「注入」上下文。上下文被創建,使用和銷燬。更常見的是,注入_repository_或其他東西,然後使用上下文。 –

+0

非常感謝你更新了這個問題 –

+2

要回答另一個問題,無論_creates_這個一次性對象是否通常負責它的_disposing_。當你將它注入另一個類時會讓事情變得複雜。 –

回答

1

是的,您可以在使用存儲庫模式時注入存儲庫接口。我的意思是你可以使用控制器的構造函數注入它。信息庫的

壽命:

所有庫實例是短暫的。這意味着,它們是按照使用情況進行實例化的。因此,您不必擔心處理上下文。

下面是一個示例:這是一個存儲庫模式。您必須注入存儲庫的接口。在此示例中它使用服務層。但是您也可以在控制器上執行此操作。

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

+0

請不要使用'內聯代碼'來突出顯示隨機編程相關的術語。它不會讓你的帖子更具可讀性,甚至相反。另請參見[何時應該將代碼格式用於非代碼文本?](http://meta.stackoverflow.com/questions/254990/when-should-code-formatting-be-used-for-non-code-text )。 – CodeCaster

+1

@CodeCaster確定,謝謝。我認爲這是你第二次給出這個建議。我會在這裏跟着:) – Sampath

-2

您可以讓DogService實現IDisposable和DogService的Dispose方法調用myDbContext.Dispose()。

+0

誰會調用這個Dispose? –

+1

@MrinalKamboj它將通過在一個使用塊中創建一個DogService實例來調用: – user1796440

+1

您還沒有理解依賴注入及其在這種情況下的工作方式,如果可行的話,OP將會這麼做很久 –

2

主要問題 - 會不會是一個好主意,如果使用Ninject IOCDBcontext使用Dependency Injection,如果是,那麼它是怎樣到達處置

是的,它可以注射,注射,下面將幫助:

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

看看下面的link,它描述了兩種模式,還提供了關於如何創建一個DBcontext細節每HttpRequest,無論有多少控制器被調用的過程中。

另一個有用的鏈接,How to handle DBContext when using Ninject

+0

不僅與Ninject當然。終身管理成爲DI容器的責任。 –

+0

@HenkHolterman同意理想情況是這樣的,但有很多浮動的DI框架,我幾乎沒有任何一個總體索賠,像Ninject這樣流行的一個,我已經使用了,所以100%肯定 –

相關問題