0

我有一个 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”的依赖注入容器来实现依赖倒置原则。但在我的情况下,创建 Nodes 类的对象似乎不被称为“依赖”。

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

我读过这样的。

“仅数据对象通常不称为“依赖项”,因为它们不执行某些需要的功能。” 有什么想法吗?

谢谢。

4

1 回答 1

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/

于 2013-08-28T10:24:51.003 回答