1

我在ASP.NET MVC應用程序中有一個靜態輔助方法。以下是一些演示問題的示例代碼(實際代碼稍微複雜一些)。請關注該模式。實際的代碼不會與數據庫交互。靜態方法和服務定位器

下面的代碼被抽象爲允許進行單元測試。我遇到的問題是獲取IDatabaseManager的具體實現。使用服務定位器不好?任何關於良好實踐的建議?我已經讀過服務定位器是反模式。請指教。代碼中的所有其他地方都使用依賴注入(這裏的問題顯然是靜態的DataWriter方法)。

public static class DataWriter { 
    public static void WriteDate() { 
     var datetime = DateTime.Now.ToString(); 

     //Is this service locator a bad pattern? 
     var databaseManager = StructureMap.ObjectFactory.Container.GetInstance<IDatabaseManager>(); 
     var dataRepository = new DataRepository(databaseManager); 

     dataRepository.Write(datetime); 
    } 
} 

public class DatabaseManager : IDatabaseManager { 
    public void Write(string s) { 
     //Write to database 
    } 
    //Other methods 
    ... 
    ... 
} 

public interface IDatabaseManager { 
    void Write(string s); 
    //Other signatures 
    ... 
    ... 
} 

public class DataRepository : IDataRepository { 
    private IDatabaseManager _databaseManager; 
    public DataRepository(IDatabaseManager databaseManager) { 
     _databaseManager = databaseManager; 
    } 

    public void Write(string data) { 
     _databaseManager.Write(data); 
    } 
} 

public interface IDataRepository { 
    void Write(string data); 
} 

根據Alex的建議進行編輯。再次 編輯刪除有關CSHTML的信息(因爲這是不是問題的重點)

+0

*寫作*數據庫從CSHTML如此多的爭議,我不會擔心它除了使用服務定位器。附註:你可能想重申你的問題(也許你的意思是「我應該使用服務定位器」,因爲你的樣本確實使用它)。 –

+0

問題不在於寫入數據庫。實際的代碼不會寫入或與數據庫交互。這是證明問題的僞代碼。同樣,我的問題是我正在使用服務定位器,但我應該首先使用它。我正在要求爲什麼這是不好的建議。 – rkrauter

回答

2

我已閱讀,服務定位器是反模式

也許不是100%,但他們應該氣餒。 Mark Seemann解釋Service Locator is an Anti-Pattern

我認爲你應該朝着Dependency Injection看。

您面臨的問題是依賴關係解析在靜態方法中固有困難。

我建議你看看在你的應用程序的其他地方實現非靜態方法和依賴注入。由於阿列克謝指出,從查看並不理想。

ASP.NET MVC 4 Dependency Injection

+0

感謝您的回覆。看起來這是關鍵。我應該避免使用靜態方法,並使用其他地方的依賴注入。 – rkrauter