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