2012-12-05 39 views
3

需要一個設計建議。 請參閱下面的課程。 類只有一個方法 類具有將userName和passWord作爲參數的構造方法。 問題是 - 請告訴我區別,如果 - 如果我從構造 刪除用戶名和pwd - 和發送(用戶名,密碼)的AuthoriseUser方法通過構造函數或類方法級別注入依賴關係?

所有這一切都在注入依賴

public class UserNameAuthorisationService : IUserNameAuthorisationService 
{ 
    private readonly string _userName; 
    private readonly string _password; 
    private readonly IUserNameAuthorisationRepository _usernameAuthRepository; 

    public UserNameAuthorisationService(string UserName, string Password, IUserNameAuthorisationRepository UsernameAuthRepository) 
    { 
     _userName = UserName; 
     _password = Password; 
     _usernameAuthRepository = UsernameAuthRepository; 
    } 

    public IUser AuthoriseUser() 
    { 
     throw new NotImplementedException(); 
    } 
} 
的背景

在此先感謝。

回答

1

在構造函數傳遞初始參數好於非可變對象,因爲如果你不提供setter方法這是「不可能」(如果不考慮任何反思技巧)來改變它們。

如果您打算不允許通過您的API更改此值,則這是實現此要求的唯一方法。否則,你可以實現setter。即使實現你可能會認爲這個對象不能存在setter方法(是沒有意義的存在)沒有用戶名和密碼,在這種情況下,我會保留兩個setter和構造函數初始化。

當我看到這個物體是沒有意義的,沒有密碼/用戶名/庫中存在,所以我會保持自己的初始化在構造函數。

如果UserNameAuthorisationService被認爲是一個組件,並且例如有一個唯一的應用程序實例(您的DI容器應該管理這個),我會將用戶名和密碼參數移動到AuthoriseUser方法。在這種情況下,我會通過DI將這個對象注入到客戶端對象中。

關鍵的一點是要保持你的對象在一致的狀態下所有的時間,而不是在使用init(),也不填充()方法。因此,作爲@Maxim指出,送花兒給人完全初始化你的對象,並在可用的狀態讓他們總是在你沒有拋出一個異常,如果AuthoriseUser()被稱爲不被認爲被預先填充,強制性參數的方式。

+0

謝謝雷納託 - 我明白你的意思。 –

1

定義參數構造函數的主要思想是用開始參數的類。 如果您不想在將來更改用戶/密碼,那麼最好使用參數構造函數。

另一方面,如果您要更改用戶/密碼 - 使用set方法和無參數構造函數。

BTW,創造一個沒有被完全初始化稱爲兩步建設類是一個反模式

+0

感謝Maxim Shoustin! –

2

好,在一般情況下,我儘量遵循這個模式: 如果我有機會,我會用構造函數注入對外部依賴

  1. 我會用構造函數注入在可能的情況
  2. 我將使用屬性注入如果沒有可能納入構造函數注入和我有一個很好的默認
  3. 方法注入在特定的情況下一定的優勢的時候依賴性也與每個方法調用不同(看看這裏的 更多詳細信息:http://manning.com/seemann/DIi.NET_sample_ch04.pdf

在你的情況,我會做以下內容:

  1. 離開倉庫注射在構造函數中
  2. 移動用戶名和密碼的方法上下文最有可能他們W¯¯不是由DI容器提供的,但它們是特定於上下文的。我不會將這些參數視爲依賴關係,而是將其視爲值對象。

使用構造函數注入到位是DI中最好的方法。最大的優點之一是,你可以很容易地看到你的班級是否違反了SOLID原則,並且你看到了你在一個地方有多少依賴關係

相關問題