C# プロジェクトに NHibernate を使用しているため、いくつかのモデル クラスがあります。
次の例を想定してみましょう。
using System;
namespace TestProject.Model
{
public class Room
{
public virtual int Id { get; set; }
public virtual string UniqueID { get; set; }
public virtual int RoomID { get; set; }
public virtual float Area { get; set; }
}
}
これらのオブジェクトを NHibernate でマッピングすることは、今のところ問題なく機能しています。ここで、新しい Room オブジェクトを生成し、それをデータベースに保存したいと考えています。各メンバーを別々に設定することを避けるために、新しいコンストラクターをモデル クラスに追加します。仮想メンバーの下に次のように記述します。
public RoomProperty()
{
}
public RoomProperty(int pRoomId, int pArea)
{
UniqueID = Guid.NewGuid().ToString();
RoomID = pRoomId;
Area = pArea;
}
FxCop でコードを分析すると、次のことがわかります。
"ConstructorShouldNotCallVirtualMethodsRule"
This rule warns the developer if any virtual methods are called in the constructor of a non-sealed type. The problem is that if a derived class overrides the method then that method will be called before the derived constructor has had a chance to run. This makes the code quite fragile.
このページでは、これが間違っている理由についても説明しており、私もそれを理解しています。しかし、私は問題を解決する方法がわかりません。
すべてのコンストラクターを消去して次のメソッドを追加すると...
public void SetRoomPropertyData(int pRoomId, int pArea)
{
UniqueID = Guid.NewGuid().ToString();
RoomID = pRoomId;
Area = pArea;
}
.... 標準コンストラクターを呼び出した後にデータを設定するには、NHibernate が初期化に失敗するため、アプリケーションを開始できません。それは言います:
NHibernate.InvalidProxyTypeException: The following types may not be used as proxies:
VITRIcadHelper.Model.RoomProperty: method SetRoomPropertyData should be 'public/protected virtual' or 'protected internal virtual'
しかし、このメソッドを仮想に設定すると、コンストラクターで仮想メンバーを設定したときと同じ間違いになります。これらの間違い (違反) を回避するにはどうすればよいですか?