49

すべてのデータベースロジックを備えたクラスライブラリがあります。私のDAL/BLL。

同じデータベースとクラスを使用するWebプロジェクトがいくつかあるので、データ層を独自のプロジェクトに抽象化することをお勧めします。

ただし、特定のプロジェクトのクラスに機能を追加する場合は、特定のクラスにメソッドを追加したいと思います。

たとえば、私のデータレイヤーにはProductオブジェクトとSomeItemオブジェクトがあります。

// Data Access Layer project

namespace DAL {
  public class Product { 
     //implementation here 
  }

  public class SomeItem {
     //implementation here 
  }
}

あるプロジェクトでは、さまざまなコンテンツアイテムで使用されるインターフェイスを追加したいので、次のクラスがあります。

// This is in Web Project
namespace DAL {
  public partial class Product : ICustomBehaviour {

    #region ICustomBehaviour Implementation
       TheSharedMethod();
    #endregion
  }
}

同じ名前空間を使用して、別のプロジェクトに部分クラスを作成する(依存関係を作成する)のは良い考えですか?それが悪い考えである場合、どうすればこのタイプの機能を機能させることができますか?

コンパイル時にそれらをマージしたくないようですので、何が間違っているのかわかりません。

4

8 に答える 8

90

プロジェクト間で部分的なクラスを作成することはできません。部分クラスは、コンパイル時のみの構文糖衣構文です。タイプ全体が1つのアセンブリ、つまり1つのプロジェクトになります。

(ちなみに、元のDALファイルでは、クラスも部分的であると宣言する必要があります。)

于 2008-11-21T19:46:59.537 に答える
5

レイヤーを整理する最善の方法についての質問にはお答えできませんが、部分クラスをエミュレートする最善の方法についての質問にはお答えできます。

ここにいくつかの考えがあります:

  • 最初に頭に浮かぶのは継承です。これが常に最善の解決策であるとは限りませんが、オブジェクトを基本クラスのように処理できるようにする必要がある場合があるため、選択肢がない場合があります。
  • コンポジションも良い選択です (つまり、クラスを別のクラスにラップします)。これにより、DAL からのデカップリングが少し良くなりますが、実装が面倒になる可能性があります。
  • 本当に既存のクラスにメソッドを 1 つまたは 2 つ追加する必要がある場合は、拡張メソッドの使用を検討することもできますが、これらを使いすぎるとスパゲッティ コードがすぐに作成される可能性があります。
于 2008-12-20T19:53:40.020 に答える
4

部分クラスは同じアセンブリに存在する必要があります。そうでなければ、コンパイラは部分クラスをどこにマージするかをどのように決定しますか?

于 2008-11-21T19:48:01.280 に答える
1

Jon Skeetの答えに同意します。

とにかく、このような問題にアプローチするのは良い選択ではないと思います。コードの層/レイヤーを分割する最良の方法を示す優れた設計パターンが既に存在します。これは、Microsoft が WinForms/WebForms デザイナー ファイルを分離し、人々がそれらを壊すのを防ぐためのちょっとした構文糖衣です。

于 2008-11-21T19:53:05.793 に答える
1

このスキームが機能しない理由はわかりません。

2 つのファイルには、ストレージ メカニズム (またはその他の機能) が含まれています。継承を指定しますが、ビジネス ロジックは含まれません。

  • ProductDataAccess.cs
  • ProductWeb.cs

1 つのファイルには、ビジネス ロジックが含まれています。

  • ProductBusinessLogic.cs

次に、2 つのプロジェクトを作成します。

  • WebProject には、ProductWeb.cs と ProductBusinessLogic.cs が含まれています。
  • DataProject には ProductDataAccess.cs と ProductBusinessLogic.cs が含まれています

どちらのプロジェクトも同じビジネス ロジックを使用します。

于 2011-03-11T19:15:28.563 に答える
0

いいえ。異なるプロジェクトで部分クラスを作成することはできません。一度にコンパイラがコンパイル用の単一のプロジェクトを取得し、そのプロジェクトでのみクラス、メソッド、フィールドなどのリストをスキャンするためです。したがって、部分クラスの一部がある場合他のプロジェクト、コンパイラはそれらを見つけることができません。

于 2014-05-22T15:39:45.790 に答える
0

プレ linq 開発に関しては Neil に同意しますが、Linq2SQL デザイナーによって生成された部分クラスからビジネス ロジックを分割するために、これを行うことができればと思います。例えば:

Northind.DAL (prj)
-NorthindDataContext (EntityNamespace set to "Northwind.BLL")
--Product() (Entity, partial class auto-generated)
--Category() (Entity, partial class auto-generated)
--Supplier() (Entity, partial class auto-generated)

Northind.BLL (prj)
-Product() : IMyCustomEnityInterface, BaseEntity (override OnValidate(), etc)
-Category() : IMyCustomEnityInterface, BaseEntity (override OnValidate(), etc)
-Supplier() : IMyCustomEnityInterface, BaseEntity (override OnValidate(), etc)

残念ながら、これを行うことはできません...実際、LINQを使用するときにレイヤー/層を分割する推奨される方法を知りたいです。

于 2008-12-20T19:36:50.493 に答える