2013-07-10 48 views
0

我有一個WCF服務,我試圖在那裏使用依賴倒置原則。我有一些疑問和下面的列表。之前依賴原理和依賴原理如下之後 代碼..WCF中的依賴倒置原則

代碼之前依賴的原則: -

INodeAppService.cs 

namespace MyAppService 
{ 

    public class Nodes 
    { 
     [DataMember] 
     public int NodeID { get; set; } 

     [DataMember] 
     public string Item { get; set; } 
    } 

    [ServiceContract] 
    public interface INodeAppService 
    { 
     [OperationContract] 
     [WebGet(ResponseFormat = WebMessageFormat.Json)] 
     List<Nodes> GetNodes(); //changed 
    } 
} 


NodeAppService.svc.cs 

namespace MyAppService 
{ 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class NodeAppService: INodeAppService 
    { 

     public List<Nodes> GetNodes() 
     { 
      List<Nodes> nodeList = new List<Nodes>(); //changed 
      SqlCommand sqlCommand = new SqlCommand("myquery", conn); 
      SqlDataAdapter da = new SqlDataAdapter(sqlCommand); 
      DataTable dt = new DataTable(); 
      try 
      { 
       da.Fill(dt); 
       foreach (DataRow row in dt.Rows) 
       { 
        Nodes node= new Nodes(); 
        node.NodeID = Convert.ToInt32(row["NodeID"]); 
        node.Item = row["Item"].ToString(); 
        nodeList.Add(node); //changed 

       } 
       return nodeList; 
      } 
      catch (Exception e) 
      { 
       throw e; 
      } 
      finally 
      { 
       conn.Close(); 
      } 
     } 

代碼之後的依賴的原則: -

INodeAppService.cs 

namespace MyAppService 
{ 

    public class Nodes 
    { 
     [DataMember] 
     public int NodeID { get; set; } 

     [DataMember] 
     public string Item { get; set; } 
    } 

    [ServiceContract] 
    public interface INodeAppService 
    { 
     [OperationContract] 
     [WebGet(ResponseFormat = WebMessageFormat.Json)] 
     IList<Nodes> GetNodes(); // List changed to IList 
    } 
} 


NodeAppService.svc.cs 

namespace MyAppService 
{ 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class NodeAppService: INodeAppService 
    { 
      private IList<Nodes> _nodeList; 
     public NodeAppService(IList<Nodes> nodeList) 
     { 
      _nodeList= nodeList; 
     } 
    public IList<Nodes> GetNodes() 
     { 
      SqlCommand sqlCommand = new SqlCommand("myquery", conn); 
      SqlDataAdapter da = new SqlDataAdapter(sqlCommand); 
      DataTable dt = new DataTable(); 
      try 
      { 
       da.Fill(dt); 
       foreach (DataRow row in dt.Rows) 
       { 
        Nodes node= new Nodes(); // How can I remove this dependency? 
        node.NodeID = Convert.ToInt32(row["NodeID"]); 
        node.Item = row["Item"].ToString(); 
        _nodeList.Add(node); 

       } 
       return _nodeList; 
      } 
      catch (Exception e) 
      { 
       throw e; 
      } 
      finally 
      { 
       conn.Close(); 
      } 
     } 

1)但我收到錯誤「提供的服務類型無法作爲服務加載,因爲它沒有默認(無參數)構造函數。要解決此問題,添加一個默認的構造函數的類型,或者通過類型主機」的一個實例。

但是,讓默認的參數將不解決我的問題,請給出一個解決方案來解決這個問題。

2)節點的節點=新節點(); //我怎樣才能刪除此依賴[請查看代碼]

3)依賴倒置原則和WCF是不錯的辦法

感謝

?。

我能夠使用名爲「Castle Windsor」的依賴注入容器來實現依賴倒置原則。但似乎在我的情況下創建節點類的對象不被稱爲「依賴」。

List<Nodes> nodeList = new List<Nodes>(); 

我已經閱讀過這樣的內容。

「僅數據對象通常不被稱爲」依賴「,因爲它們不執行某些所需的功能。」有什麼想法嗎?

謝謝。

+1

什麼依賴注入容器是否在使用? –

+0

你是什麼意思的「依賴注入容器」。無論如何,我通過構造函數添加依賴注入.. – Dev

+0

我不知道任何「依賴注入容器」。現在我試着與「溫莎城堡」一起工作。謝謝您的幫助。 http://www.prideparrot.com/blog/archive/2012/2/dependency_injection_in_wcf_using_castle_windsor – Dev

回答

0

這裏的依賴關係是您的服務實現而不是特定的節點集合,您的WCF服務依賴於應抽象並注入服務的SQL數據訪問代碼。

本質上需要被放在一個接口前的以下代碼,以便您的WCF服務不再有此依賴性

  SqlCommand sqlCommand = new SqlCommand("myquery", conn); 
     SqlDataAdapter da = new SqlDataAdapter(sqlCommand); 
     DataTable dt = new DataTable(); 
     try 
     { 
      da.Fill(dt); 
      foreach (DataRow row in dt.Rows) 
      { 
       Nodes node= new Nodes(); // How can I remove this dependency? 
       node.NodeID = Convert.ToInt32(row["NodeID"]); 
       node.Item = row["Item"].ToString(); 
       _nodeList.Add(node); 

      } 
      return _nodeList; 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
     finally 
     { 
      conn.Close(); 
     } 

以下博客使用存儲庫模式來實現依賴倒置 http://thedersen.com/blog/2010/04/20/dependency-inversion/