8

私の考えでは、ビジネスオブジェクトのIDフィールドは読み取り専用(publicgetおよびprivateset)である必要があります。これは、定義上、IDが変更されることはないためです(データベース内のレコードを一意に識別するため)。

これは、新しいオブジェクト(IDがまだ設定されていない)を作成するときに問題を引き起こします。たとえば、新しく作成されたIDを返すストアドプロシージャを使用してデータベースに保存し、IDプロパティが読み取られた場合にオブジェクトにどのように保存しますか。 -それだけ?

例:

Employee employee = new Employee();  
employee.FirstName="John";  
employee.LastName="Smith";  

EmployeeDAL.Save(employee);

Saveメソッド(実際にデータベースに接続して新しい従業員を保存する)は、このプロパティが読み取り専用の場合(EmployeeIdが作成されると変更されないため)、EmployeeオブジェクトのEmployeeIdプロパティをどのように更新しますか。

Idは、DALによって書き込み可能であり、他の世界では読み取り専用である必要があるようです。特にDALクラスとビジネスオブジェクトクラスが異なるアセンブリにある場合、これをどのように実装しますか?

このクラスはデータベースとは何の関係もないはずなので、EmployeeクラスにSaveメソッドを作成したくありません。

4

5 に答える 5

2

別の可能な解決策は、従業員を次のように宣言することです:-

public class Employee
{
    public int Id { get; internal set; }
}

... EmployeeクラスとDALクラスが同じアセンブリ内

にある場合、私はそれが好きだとは主張しませんが、私はそれを使用しました。

于 2009-08-11T11:30:26.867 に答える
1

DALメソッドが更新されたオブジェクトを返すようにすることができます。

public class EmployeeDAL
{
    Employee EmployeeDAL.Save (Employee employee)
    {
        // Save employee
        // Get the newly generated ID
        // Recreate the object with the new ID and return it
    }
}

または、コードで新しいIDを生成し、このIDでオブジェクトをインスタンス化してから、DALに保存するように依頼することもできます。

保存操作中にオブジェクトを更新したい場合は、このプロパティを公開する必要があります。

私は個人的に不変のオブジェクトを作成するのが好きです。それらは、すべての値をコンストラクターに渡すことによって一度だけセットアップできます。このアプローチでは、保存するオブジェクトを作成し、データベースから割り当てられたIDとともにオブジェクトを取得して、呼び出し元に返します。

于 2009-08-11T10:55:59.357 に答える
1

IDのセッターは、以前にまだ設定されていない場合にのみ、設定を許可することができます。

public class Employee
{
    private int? m_ID;

    public int? ID
    {
        get { return m_ID; }
        set
        {
            if (m_ID.HasValue())
                throw ...
            m_ID = value;
        }
    }
}

あるいは、一部のフレームワークはこのタイプの機能をサポートしていると思います(たとえば、NHibernateではIDフィールドにプライベートセッターを設定できると思います)。

于 2009-08-11T10:56:39.277 に答える
1

DALの外部のコードが、Idフィールド(およびその他の不変フィールド)のセッターを提供しないインターフェイスを介してオブジェクトを参照できるようにするのはどうでしょうか。

public interface IEmployee
{
    Int32 Id {get;}
    String Name {get;set;}
    // ... and so on ...
}

public class Employee: IEmployee
{
    Int32 Id {get;set;}
    String Name {get;set;}
}

DALは必要に応じて設定できますが、消費するコードは設定できません。

于 2009-08-11T11:53:51.703 に答える
0

どうですか:

Employee employee = new Employee(EmployeeDAL.GetNextID());

これにより、保存コードも簡単になります。

于 2009-08-11T10:54:58.327 に答える