0

C# アプリケーションをレイヤーに分割しながら、次の方法でレイヤー間の循環依存の問題を解決しました。

using System;
using System.Collections.Generic;
using System.Text;

using SolvingCircularDependency.Common;
using SolvingCircularDependency.DA;

namespace SolvingCircularDependency.BO
{
    public class MyClass : IPersistent
    {
        private string _message;
        public string Message
        {
            get { return _message; }
            set { _message = value; }
        }

        public bool Save()
        {
             return MyClassDA.Save(this);
        }
    }
}


using System;
using System.Collections.Generic;
using System.Text;

namespace SolvingCircularDependency.Common
{
    public interface IPersistent
    {        
        bool Save();
        string Message { get;}
    }
}

using System;
using System.Collections.Generic;
using System.Text;

using SolvingCircularDependency.Common;

namespace SolvingCircularDependency.DA
{
    public class MyClassDA
    {
        public static bool Save(IPersistent obj)
        {
            Console.WriteLine(obj.Message);

            return true;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

using SolvingCircularDependency.BO;

namespace SolvingCircularDependency.UI
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myobj = new MyClass();
            myobj.Message = "Goodbye Circular Dependency!";
            myobj.Save();

            Console.ReadLine();
        }
    }
}

sln の「共通」プロジェクトが冗長に見えるので、誰かが私にもっと良い解決策を提案できますか?

4

3 に答える 3

2

IPersistent を Common または Service アセンブリで宣言する必要があるかどうかを決定するのは、ユーザー次第です。ベスト プラクティス (通常) は、レイヤー分離を向上させるために別のアセンブリでインターフェイスを宣言することです。開発者が IPersistent の実装を作成する頻度、本当に疎結合にする必要があるかなどを考慮する必要があります。

于 2009-09-12T18:04:00.217 に答える
0

IPersistence は DA にとって重要であり、BO が IPersistence を介して通信するための手段です。その関係はそこで終わるべきです。UI は BO のみを認識し、「コントラクトへのコーディング」をサポートする新しいインターフェイスを定義する必要がある場合は、BO で新しいインターフェイスを定義する必要があります。UI と BO は、システム内で何をするかについて個別に考慮する必要があります。

たとえば、IPersistence インターフェイスは、レコードをデータベースに永続化するための特定のタスクを定義します。BO をバイパスするため、UI でそれは望ましくありません。したがって、実際には何も実行せず、まったく存在してはならない貧血 BO が必要な場合を除き、ビジネス ロジックのサポートに関連するそのレベルで何か新しいものを定義します。

于 2009-09-12T18:46:01.503 に答える