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) ノード node= new Nodes(); // この依存関係を削除するにはどうすればよいですか? 【コードをご覧ください】

3)依存性逆転の原則とwcfは良いアプローチですか?

ありがとう。


「Castle Windsor」という名前の Dependency Injection Container を使用して、Dependency Inversion Principle を実装することができました。しかし、私の場合、 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 に答える