1

現在、アプリケーションの UI レイヤーは DAL dll に結合されています。Dal は次のように初期化されます。

//Initialize Data Access for AS400
Dal = JDE8Dal.Instance;
Dal.conString = Properties.Settings.Default.conAS400;

DAL はシングルトンとして設計されています。アプリケーションに 1 つのインスタンスを強制するのは良い考えだと思いました。

ダル:

public class JDE8Dal
    {
        public string conString { get; set; }
        private static readonly JDE8Dal _instance = new JDE8Dal();
        private JDE8Dal()
        {
        }
        public static JDE8Dal Instance
        {
            get { return _instance; }
        }
        // Methods
    }

私の BLL は次のようになります。

namespace YLA.Barcode
{
    public static class YlaBarcodeUtil
    {
        public static string LotStripZeroes(string str)
        {
            var ret = str;
            if (str.Trim().StartsWith("00"))
            {
                ret = YlaGeneralUtilities.StripLeadingNumofChars(str, 2);
            }
            return ret;
        }
    }

public class BarcodeBLL
{
    //DAL INIT HERE?
}
}

より多くのアプリケーションを構築する必要があるので、3 層アーキテクチャに移行して DDD を読み始める必要があります。

1) BLL で DAL 処理を移動するには? BLL セクションに初期化を追加するだけですか?

2) DAL 設計をシングルトンとして保持する必要がありますか?

4

3 に答える 3

3

Inversion of Control パターンを使用して、レイヤー間の依存関係を減らす必要があります。あなたの場合、クラスでデータコンテキストが必要になるため、コンストラクターインジェクションを使用します。

public class BarcodeBLL
{
    private JDE8Dal _context;

    public BarcodeBLL(JDE8Dal context)
    {
        _context = context;
    }
}

データ コンテキストは、存続期間の短いオブジェクトである必要があります。Web アプリケーションを開発している場合は、リクエストごとに 1 つのデータ コンテキストをインスタンス化する必要があります。ORM (Entity Framework / NHibernate) の使用もお勧めします。

于 2012-12-10T08:49:30.903 に答える
0
//Initialize Data Access for AS400
Dal = JDE8Dal.Instance;
Dal.conString = Properties.Settings.Default.conAS400;

そのコメントは誤解を招くものです。このコードは、実際にはデータ アクセスを初期化するのではなく、データベース接続文字列を設定するだけです。これは、UI ではなく、DAL 自体で行う必要があります。

public class JDE8Dal
    {
        public string conString { get; set; }
        private static readonly JDE8Dal _instance = new JDE8Dal();
        private JDE8Dal()
        {
        }
        public static JDE8Dal Instance
        {
            get { return _instance; }
        }
        // Methods
    }

通常、レイヤーはこのように定義されません。DAL はクラスではなく、アセンブリ/DLL です。あなたが書いたように、すべての永続化ロジックが定義されている神のオブジェクトが必要なようです。データ アクセス層のクラスは、よりきめ細かく特化されています。たとえば、リポジトリ/DAO は、1 つの特定のドメイン オブジェクトの永続性を管理します。

さらに、「インスタンスを 1 つだけ持つのが適切であるという理由だけで」シングルトンに頼ることは、一般的には良い考えではありません。特に、変更可能なシングルトンではありません。あなたの例では、誰でも変更できDal.Instance.conString、シングルトンの他の消費者に劇的な結果をもたらす可能性があります。他の欠点の中でも。

DAL の実装が 1 つ (一見 AS400) になる可能性が高い場合でも、適度に複雑なプロジェクトでは、単体テストの目的で依存性注入を使用することをお勧めします。DI を使用すると、具体的な DAL オブジェクトの実装を、はるかに軽量で単体テストに役立つ偽の DAL オブジェクトに簡単に置き換えることができます。

public class BarcodeBLL
{
    //DAL INIT HERE?
}

非、ここには DAL 初期化はありません ;)

ビジネス ロジック層 (DDD のドメイン層) は DAL への参照を持つべきではなく、DAL は BLL への参照を持つべきです。ドメイン オブジェクトは、あまりにも多くの責任 (単一責任の原則) を持ち、BLL と DAL の間に緊密な結合を作成し、再利用と維持が非常に厄介になるため、それ自体を永続化する方法 (永続性無視の原則) を認識すべきではありません。 BLL。

于 2012-12-11T13:15:40.483 に答える
0

1: 通常、構成を行うインフラストラクチャ層があります。

2: 絶対にありません。これは「プログラミングを学ぶ」の境界です。IOC コンテナーを使用します。

于 2012-12-10T08:53:46.013 に答える