2015-05-04 5 views
0


У меня проблема с библиотекой классов C# и службой сервиса WCF. Я построил библиотеку классов с двумя классами Graph и Vertice. И у них мало общественных методов внутри. Затем я создал и опубликовал (IIS 7) простое приложение WCF, которое использует эту библиотеку классов. Код:Библиотека классов C# в приложении службы WCF

public class GraphsService : IGraphsService 
{ 
    public Graph getGraph(int val) 
    { 
     return new Graph(val); 
    } 
} 

Конечно публиковать процесс пошел хорошо, и у меня есть доступ к WCF. И теперь проблема:

Когда я создал клиентское приложение (Web) и добавил ссылку на службу к этому проекту, я могу получить доступ к методу getGraph (int val), но он возвращает класс, который не имеет ни одного из методов I реализован в библиотеке классов. Код для клиента:

protected void Page_Load(object sender, EventArgs e) 
    { 
     GraphsServiceClient gc = new GraphsServiceClient(); 
     Graph g = gc.getGraph(5); 
     lblGraph.Text = g.ToString(); 
    } 

Эта линия возвращает мне

GraphsClient.GraphService.Graph

Но я хочу, чтобы вернуть мой переопределен метод ToString (который реализуется в библиотеке классов). Как я могу заставить его работать?

Мой Graph класс из класса библиотеки (удалены несколько методов:

public class Graph 
    { 
     protected List<Vertice> _vertices; 

     public Graph() 
     { 
      this._vertices = new List<Vertice>(); 
     } 
     public Graph(int startValue) 
     { 
      this._vertices = new List<Vertice>(); 
      this._vertices.Add(new Vertice(startValue)); 
     } 

     public List<Vertice> Vertices 
     { 
      get 
      { 
       return this._vertices; 
      } 
     } 

     public Vertice getFirstVertice() 
     { 
      if (this._vertices.Count != 0) return this._vertices.First(); 
      throw new GraphException("Graaph doesn't have any vertices in it!"); 
     } 

     public Vertice findVertice(int value) 
     { 
      foreach (Vertice v in this._vertices) 
      { 
       if (v.value == value) return v; 
      } 
      return null; 
     } 

     public Graph addVertice(Vertice v, bool undirected = true) 
     { 
      if (this._vertices.Contains(v)) throw new GraphException("There is already this vertice in graph!"); 
      foreach (int val in v.Neighbours) 
      { 
       Vertice tmp = this.findVertice(val); 
       if (tmp != null) 
       { 
        if (undirected) tmp.addNeighbour(v.value); 
       } 
       else throw new GraphException("There isn't a vertice " + val + " in graph so it can't be in neighbours list!"); 
      } 
      this._vertices.Add(v); 
      return this; 
     } 

     public int[,] getAdjacencyMatrix() 
     { 
      int[,] adMatrix = new int[this._vertices.Count + 1, this._vertices.Count + 1]; 
      Array.Clear(adMatrix, 0, adMatrix.Length); 
      int l = 1; 
      foreach (Vertice v in this._vertices) 
      { 
       adMatrix[0, l] = v.value; 
       adMatrix[l, 0] = v.value; 
       l++; 
      } 
      for (int i = 1; i < this._vertices.Count + 1; i++) 
      { 
       for (int j = 1; j < this._vertices.Count + 1; j++) 
       { 
        int val1 = adMatrix[i, 0]; 
        int val2 = adMatrix[0, j]; 
        Vertice v = this.findVertice(val1); 
        if (v.hasNeighbour(val2)) adMatrix[i, j] = v.countNeighbours(val2); 
       } 
      } 
      return adMatrix; 
     } 

     public string getAdjacencyMatrixAsString() 
     { 
      string ret = ""; 
      int[,] adM = this.getAdjacencyMatrix(); 
      for (int i = 0; i < Math.Sqrt((double)adM.Length); i++) 
      { 
       for (int j = 0; j < Math.Sqrt((double)adM.Length); j++) 
       { 
        if (i != 0 || j != 0) ret += adM[i, j] + "\t"; 
        else ret += "\t"; 
       } 
       ret += "\n"; 
      } 
      return ret; 
     } 

     public override string ToString() 
     { 
      string ret = ""; 
      foreach (Vertice v in this._vertices) 
      { 
       ret += "Vertice: " + v.value + " neighbours: "; 
       foreach (int val in v.Neighbours) 
       { 
        ret += val + ", "; 
       } 
       ret = ret.Remove(ret.Length - 2); 
       ret += "\n"; 
      } 
      ret = ret.Remove(ret.Length - 1); 
      return ret; 
     } 

    } 
+0

Вы возвращаете объект «Graph» из вашей службы WCF. Отправьте класс 'Graph' и сообщите нам, какое свойство из этого класса вы хотите отобразить. Как сейчас, он пытается преобразовать весь класс 'Graph' в строку, которая, если вы не переопределите' ToString', просто вернет имя типа. Нам нужно посмотреть, как вы его преодолели, потому что что-то в классе «Граф» неверно. –

+0

Метод ToString переопределен, а в приложении клиента я не вижу никаких методов, реализованных в библиотеке классов. –

+0

Не могли бы вы проверить пространство имен Graph в Page_Load? Я боюсь, что вы используете * сгенерированный мной код * не ваш класс – sac1

ответ

1

Ok, как я получить его вы Graph класс помечается как DataContract и вы пытаетесь добавить поведение к нему, которые могут быть доступны Проблема заключается в том, что DataContract - это, в основном, DTO (объект передачи данных). Ни одно из действий, которые вы определяете как часть класса DataContract, не будет доступно для клиента-потребителя, так как единственными элементами, которые будут сериализованы, будут свойства. Не зная точно, каково ваше ожидание поведения метода ToString() для объекта Graph, вы можете добавить свойство к объекту Graph, которое возвращает любую часть информации, на которую вы надеетесь получить доступ. Таким образом, вы может сделать что-то подобное.

Graph g = gc.getGraph(5); 
lblGraph.Text = g.Name; 

Глядя на реализацию своего класса Graph, я вижу, что вы добавляете целую кучу поведения в DataContract в качестве подозреваемого. Я бы переместил все это на реализацию вашего OperationContract. Ни один из методов, которые вы определили в классе Graph, не будет доступен клиенту.

Смежные вопросы