我有一个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>();
我读过这样的内容。
“仅数据对象通常不被称为”依赖“,因为它们不执行某些所需的功能。”有什么想法吗?
感谢。
答案 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/