2

ほぼ同一のデータベースの 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 マッピング ツール (商用またはオープン ソース) を使用して、問題の解決策を提案できますか?

どうもありがとう、

ポール

4

3 に答える 3

2

データプロバイダーを抽象化して、2つのバージョンを実装してみませんか(1つはレガシーデータアイテム用のnhibernateマッピング、もう1つは新しいデータアイテム用)。

コードを少し言い換えると(わかりやすくするために簡略化):

public abstract class AbstractData
{
    public abstract string SomeValue { get; set; }
    public abstract bool ReadOnly { get; set; }
    //etc.
}

public interface IDataProvider
{
    AbstractData Get(object id);
}

public class LegacyData : AbstractData
{
     // Implement AbstractData, and
     public virtual long Id { get { return m_Id; } set { m_Id = value; };
     private long m_Id;
}

public class LegacyDataNHibernateProvider : IDataProvider
{
     public LegacyDataProvider()
     {
         // Set up fluent nhibernate mapping 
     }

     public AbstractData Get(object id)
     {
           // Interpret id as legacy identifier, retrieve LegacyData item, and return
     }
};

// Same again for new data provider

このように、nhibernate(またはデータベース)に縛られることはなく、正しく型指定された識別子(nhibernateが処理できる)を使用して具象クラスを指定できます。これは私が採用しているアプローチであり、現在、既存のデータベースのSPに対してマップする必要がありますが、後で新しいORMベースのシステムに移行します。

于 2009-01-20T11:35:10.650 に答える
0

全体像を知らずに推奨するのは難しいですが.... SPに両方のテーブル構造に対して同一のデータセットを返すようにすることで、SPに抽象化を作成できます。

私が考えているもう 1 つの抽象化は、実際には異なる hybernate マッピング ファイルを指定し、接続するデータベースに応じて異なるファイルで Hibernate を初期化できるということです。

于 2009-01-15T05:02:08.180 に答える
0

あなたの質問を正しく理解していないかもしれませんが、「Factory Pattern」のようなものを実装する必要があるように思えます。

私は最近、勤務先の会社が JDE から SAP に切り替えたときに、ファクトリ パターンを使用して 2 つのデータ レイヤーにコーディング (c#) しました。構成スイッチを切り替えて 2 つのデータ レイヤーを切り替えることができましたが、GUI は違いを認識しませんでした。

ここに私が見つけたいくつかのリンクがあります:

http://msdn.microsoft.com/en-us/library/ms954600.aspx http://www.allapplabs.com/java_design_patterns/factory_pattern.htm http://en.wikipedia.org/wiki/Abstract_factory_pattern

NHibernate に関する限り、私はそれに慣れていません...申し訳ありません。お役に立てれば。

于 2009-01-15T04:40:23.577 に答える