WCF中的依赖倒置原则

时间:2013-07-10 10:07:57

标签: wcf solid-principles dependency-inversion

我有一个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)节点node = new Nodes(); //如何删除此依赖项? [请参阅代码]

3)依赖倒置原则和wcf是好方法吗?

感谢。


我能够使用名为“Castle Windsor”的依赖注入容器实现依赖性倒置原则。但似乎在我的情况下,创建Nodes类的对象不被称为“依赖”。

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

我读过这样的内容。

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

感谢。

1 个答案:

答案 0 :(得分: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/