2015-07-18 6 views
1

Я столкнулся с проблемой круговой зависимости, когда я обращаюсь к методу classA из ClassB. У меня были следующие рекомендации ранее по моему решению. вызов метода класса A -> метод класса B, это нормально с ссылкой на библиотеку B в библиотеку A. Но тогда у меня было требование вызова метода classA из ClassB, но затем я не могу добавить ссылку, потому что она вызывает проблему с круговой зависимостью.не может решить проблему с круговой зависимостью

Итак, я попытался добавить интерфейс для решения проблемы.

Теперь я хочу вызвать метод GetDataFromDB() из класса B.

Как класть _classAObj в класс B. Нужно ли мне переходить из класса индекса, где находится основной метод.

enter image description here

using ClassLibraryC; 

namespace ClassLibraryB 
{ 
    public class ClassB 
    { 
     IClassA _classAObj = null; 

     public ClassB() 
     { } 

     public ClassB(IClassA objc) 
     { 
      _classAObj = objc; 
     } 

     public string GetDataFromDB(string cdata) 
     { 
      // connect db and get data 
      // using data reader 
       while(rdr.read()) 
      { 
       // need to call StartProcess() method of classA 
       _classAObj.StartProcess("data"); 
      } 
      return "client data:name : xyz: age:23"; 
     } 
    } 

using ClassLibraryB; 
using ClassLibraryC; 

namespace ClassLibraryA 
{ 
    public class ClassA : IClassA 
    { 

     public ClassA() {} 

     public void GetClientData() 
     { 
      ClassB b = new ClassB(); 
      string result= b.GetDataFromDB("c1"); 
     } 

     public void StartProcess(string d) 
     { 
      string data = d; 
     } 
    } 
} 

using ClassLibraryA; 

namespace ClassLibraryC 
{ 
    public interface IClassA 
    { 
     void StartProcess(string d); 
    } 
} 

namespace Start 
{ 
    class Index 
    { 
     static void Main(string[] args) 
     { 
      ClassA a = new ClassA(); 
      a.GetClientData(); 
     } 
    } 
} 
+1

Непонятно, в чем проблема. Ваше решение для интерфейса в библиотеке C - это нормальный способ его исправления, и вы это уже сделали. Каков ваш реальный вопрос? –

+0

@ScottChamberlain Мне нужно вызвать метод StartProcess() классаA из метода GetDataFromDB() класса B. Так что мне нужно передать объект classA из метода GetClientData() класса B с помощью перегруженного конструктора. –

ответ

1

Просто передать экземпляр ClassA, чтобы ClassB используя this ,

public class ClassA : IClassA 
{ 
    public ClassA() {} 

    public void GetClientData() 
    { 
     ClassB b = new ClassB(this); 
     string result= b.GetDataFromDB("c1"); 
    } 

    public void StartProcess(string d) 
    { 
     string data = d; 
    } 
} 

Вы можете избавиться от ClassB() конструктора, он больше не нужен, вам нужен только public ClassB(IClassA objc) конструктор.

+0

Вы можете увидеть какие-либо проблемы в GetDataFromDB() класса B. Я вызываю метод classA оттуда. Является ли этот подход лучшим, или мне нужно идти на события. –

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

  • Нет связанных вопросов^_^