ほぼ同一のデータベースの 2 つのバージョンがあります。以下に、基本的な違いを示す例の表を作成しました。つまり、ID 列が整数 ID から GUID に変更され、さまざまなプロパティが更新されました。アーカイブされた例では、読み取り専用に置き換えられ、非表示になっています。
レガシー バージョン:
CREATE TABLE Example
(
--Data Identity (maps to DbId in the example code)
Id int IDENTITY PRIMARY KEY,
--Example columns
SomeValue varchar(50),
AnotherValue int,
--Data Properties
Archived bit
)
新しいバージョン:
CREATE TABLE Example
(
--Data Identity (maps to DbId in the example code)
Id uniqueidentifier PRIMARY KEY,
--Example columns
SomeValue varchar(50),
AnotherValue int,
--Data Properties
ReadOnly bit,
Hidden bit
)
NHibernate などの O/R マッパーを使用して、これらのデータベース バージョンのいずれかに接続できるようにする必要があります。構成ファイルの設定を通じて、使用するバージョンをアプリケーションに伝えられるようにしたいと考えています。
私の最初の計画は、ビジネス ロジック用の共通インターフェイスを作成し、Unity などの IoC コンテナーを使用して、構成ファイル内の関連する具象クラスを交換することでした。
以下は、この理論をテストするために作成したコードの例です。
public interface IDataIdentity
{
object Id { get; }
}
public class LegacyDataIdentity : IDataIdentity
{
public virtual long DbId { get; set; }
public object Id
{
get { return DbId; }
}
}
public class NewDataIdentity : IDataIdentity
{
public virtual Guid DbId { get; set; }
public object Id
{
get { return DbId; }
}
}
public interface IDataProperties
{
bool ReadOnly { get; set; }
bool Hidden { get; set; }
}
public class LegacyDataProperties : IDataProperties
{
public virtual bool Archived { get; set; }
public bool ReadOnly
{
get { return Archived; }
set { Archived = value; }
}
public bool Hidden
{
get { return Archived; }
set { Archived = value; }
}
}
public class NewDataProperties : IDataProperties
{
public virtual bool ReadOnly { get; set; }
public virtual bool Hidden { get; set; }
}
public class DataItem
{
public DataItem(IDataIdentity dataIdentity, IDataProperties dataProperties)
{
DataIdentity = dataIdentity;
DataProperties = dataProperties;
}
public IDataIdentity DataIdentity { get; set; }
public IDataProperties DataProperties { get; set; }
}
public class Example : DataItem
{
public Example(IDataIdentity dataIdentity, IDataProperties dataProperties)
: base(dataIdentity, dataProperties)
{
}
public virtual string SomeValue { get; set; }
public virtual int AnotherValue { get; set; }
}
これが可能かどうか (具体的には Unity と NHibernate で)、誰でもアドバイスできますか? もしそうなら、関連する NHibernate マッピング ファイルを作成する方法を教えてください。
または、他の方法または他の IoC および O/R マッピング ツール (商用またはオープン ソース) を使用して、問題の解決策を提案できますか?
どうもありがとう、
ポール