2012-03-28 131 views
3

是否有任何我的POCO應該參與DI的場景。這是一種代碼味道嗎?持久對象和依賴注入

+0

可能的重複[爲什麼不使用IoC容器來解決實體/業務對象的依賴關係?](http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to- resolve-dependencies-for-entities-business-objec) – Steven 2012-03-28 19:12:11

回答

1

我認爲代碼異味是指示某些東西可能是錯的,但不一定是錯的。我不知道這是上升到這個水平。

想象一下,您有一個Customer POCO和一個短期的CustomerValidator對象,該對象在單個客戶上運行。我將xtor注入用作我認爲是關鍵依賴的東西,而CustomerValidator肯定會對客戶產生嚴重的依賴性 - 沒有它就沒有任何意義。

因此,根據我的估計,這是一個場景(儘管這是一個人爲設計的場景),這很好。我會說,與POCO相比,你的對象的生命週期必須做得更多,以及你的對象如何依賴POCO。

但是,要清楚的是,當我編碼時,這對我來說不一定是常見的情況。我只是不知道我會認爲它是一種「氣味」。也許如果它發生了很多......我的兩分錢,無論如何。

編輯:例如:

public class Customer 
{ 
    public virtual string LastName { get; set; } 

    public virtual string FirstName { get; set; } 

    public virtual string Ssn { get; set; } 
} 

public class CustomerValidator 
{ 
    private readonly Customer _customer; 

    public CustomerValidator(Customer customer) 
    { 
     _customer = customer; 
    } 

    public void FixIfNotValid() 
    { 
     if (!IsValid()) 
     { 
      _customer.Ssn = "123456789"; 
      _customer.LastName = "Smith"; 
     } 
    } 

    public bool IsValid() 
    { 
     return !string.IsNullOrEmpty(_customer.Ssn) && !string.IsNullOrEmpty(_customer.LastName); 
    } 
} 

在這裏,你有一個POCO(客戶),並指每個與POCO POCO關係的一個驗證器對象。也就是說,驗證器將POCO封裝爲其狀態的一部分,並對其執行一些(可以承擔的操作)操作。

如果沒有POCO,驗證器對象就沒有意義,所以有理由認爲您會以強制客戶端提供POCO(即構造器依賴注入)的方式編寫代碼。忽略這個例子的人爲本質,我不認爲這是一種代碼味道。

你有一個依賴項,你在這裏注入它。如果稍後,您定義了客戶的繼承者,那麼驗證器仍然會對他們進行處理。您可以通過替換您的POCO的測試版來測試您的驗證器。因此,在這種情況下,DI的各種動機就像在注入面向服務的類時一樣。所以,我個人認爲沒有理由不注射。

+0

你可以給出一個代碼示例。 – Greens 2012-03-28 18:23:16

+0

當你說POCO時,是指C#的「C」嗎? – 2012-03-28 18:24:22

+0

Yes.its C#.... – Greens 2012-03-28 18:25:29