2013-07-10 4 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) 하지만 오류가 발생했습니다 "기본 제공된 (매개 변수가없는) 생성자가 없기 때문에 제공된 서비스 유형을 서비스로로드 할 수 없습니다. 문제를 해결하려면 형식에 기본 생성자를 추가하거나 유형 인스턴스를 호스트에 전달하십시오. "

기본 매개 변수를 지정해도 내 문제가 해결되지 않을 수 있습니다. 문제를 해결할 수있는 해결책을 제공하십시오 ..

// 어떻게이 종속성을 제거 할 수 있습니다

3) 의존 관계 역전 원칙과 WCF 좋은 방법입니다

감사

[코드 참조하시기 바랍니다];?.을

2) 노드 = 새로운 노드를() 노드


"Castle Windsor"라는 종속성 주입 컨테이너를 사용하여 Dependency Inversion Principle을 구현할 수있었습니다. 하지만 내 경우에는 노드 클래스의 개체를 만드는 것처럼 보이지 않는 "종속성".

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

나는 이렇게 읽었다.

"데이터 전용 개체는 필요한 기능을 수행하지 않으므로 일반적으로"종속성 "이라고는하지 않습니다." 이견있는 사람?

감사합니다.

+1

무엇 의존성 주입 컨테이너를 사용하고 있습니까? –

+0

"Dependency Injection container"는 무엇을 의미합니까? 어쨌든 나는 생성자를 통해 의존성 주입을 추가하고있다. – Dev

+0

나는 "Dependency Injection container"를 전혀 알지 못했다. 이제는 "캐슬 윈저 (Castle Windsor)"로 시도해 보았습니다. 도와 주셔서 감사합니다. 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/