Принцип обращения зависимостей в 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 - это хороший подход?

Благодарю.


Мне удалось реализовать принцип инверсии зависимости с помощью контейнера для инъекций зависимости под названием "Замок Виндзор". Но, похоже, в моем случае создание объекта класса Nodes не называется "Зависимость".

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

Я читал так.

"Объект только для данных обычно не называют" зависимостью ", поскольку они не выполняют какой-либо необходимой функции". Какие-нибудь мысли?

Благодарю.

1 ответ

Зависимость здесь - ваша реализация Сервиса, а не коллекция конкретных узлов. Ваша служба 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/

Другие вопросы по тегам