0

typeアプリケーション内の各ビジネス オブジェクトをデータベース内のテーブルに保存する必要がある状況があります。typeそれぞれを何らかの形で表す必要がありenumます。

私のモデルから独立している別のdllに基本的なフレームワークが存在し、そうあるべきです。私のモデル クラスは、まず外部フレームワークから基本クラス/インターフェイスを継承する必要があります。問題はenum、ビジネス オブジェクトを外部 dll に表すことができないことです。これは、どのモデルにも依存しない必要があるためです。例えば、

外部 dll の基本クラス:

namespace external
{
    public enum EnumThatDenotesPoco { Vehicle, Animal, Foo }

    public abstract class Framework
    {
        public abstract EnumThatDenotesPoco RecordType { get; }
    }
}

と私のプロジェクト:

namespace ourApplication
{
    public class Vehicle : Framework
    {
        public override EnumThatDenotesPoco RecordType { get { return  EnumThatDenotesPoco.Vehicle; } }
    }
}

Vehicle, Animal, Foo私のアプリケーションプロジェクトにあるので動作しません。この場合、より良い設計は何でしょうか?

2つの方法がありますが、それが正しいアプローチかどうかはわかりません。

1.

namespace external
{
    public abstract class Framework
    {
        public abstract Enum RecordType { get; } //base class of all enums
    }
}

namespace ourApplication
{
    public enum EnumThatDenotesPoco { Vehicle, Animal, Foo }

    public class Vehicle : Framework
    {
        public override Enum RecordType { get { return  EnumThatDenotesPoco.Vehicle; } }
    }
}

これは機能します。vehicle.RecordType.当然のこと0です。

2.

namespace external
{
    public class EntityBase // an empty enum class
    {

    }

    public abstract class Framework
    {
        public abstract EntityBase RecordType { get; } 
    }
}

namespace ourApplication
{
    public sealed class Entity : EntityBase
    {
        public static readonly Entity Vehicle = 1;
        public static readonly Entity Animal = 2;
        public static readonly Entity Foo = 3; //etc

        int value;
        public static implicit operator Entity(int x)
        {
            return new Entity { value = x };
        }

        public override string ToString()
        {
            return value.ToString();
        }
    }

    public class Vehicle : Framework
    {
        public override EntityBase RecordType { get { return  Entity.Vehicle; } }
    }
}

どちらも機能します。

4

1 に答える 1

1

T4 テンプレートを考えてみると、必要以上に複雑であることがわかりました。私はいくつかの変更を加えた2番目のアプローチを採用しました。

Enumアプローチの問題:

  1. dbにSystem.Enum直接保存できます(などは実際の基になる値を与えることができます) が、db から .xml としてきれいに取得することはできません。Convert.ToInt32(System.Enum)System.Enum.ToString()System.Enum

  2. System.Enum完全に一般的であり、何も明らかにしないため混乱する可能性があります。

私は2番目のアプローチを採用しましたが、マイナーな変更を加えました:

namespace external
{
    public abstract class Framework
    {
        public abstract Entity RecordType { get; } 
    }



    public sealed class Entity
    {
        int value;

        Entity()
        {

        }

        public static implicit operator Entity(int i)
        {
            return new Entity { value = i };
        }

        public bool Equals(Entity other)
        {
            if (ReferenceEquals(this, other))
                return true;

            if (ReferenceEquals(null, other))
                return false;

            return value == other.value;
        }

        public override bool Equals(object obj)
        {
            return Equals(obj as Entity);
        }

        public static bool operator ==(Entity lhs, Entity rhs)
        {
            if (ReferenceEquals(lhs, null))
                return ReferenceEquals(rhs, null);

            return lhs.Equals(rhs);
        }

        public static bool operator !=(Entity lhs, Entity rhs)
        {
            return !(lhs == rhs);
        }

        public override int GetHashCode()
        {
            return value;
        }

        public override string ToString()
        {
            return value.ToString();
        }
    }
}

そこにすべてのロジックを与えることで、基本列挙型クラス ( Entity) を空でないようにしました。そのため、検証コードを参照プロジェクトに記述する必要はありません。メイン アセンブリのどこかに列挙値を書き込むことができます。

namespace ourApplication
{
    public static class Global
    {
        public static readonly Entity Vehicle = 1;
        public static readonly Entity Animal = 2;
        public static readonly Entity Foo = 3; //etc
    }

    public class Vehicle : Framework
    {
        public override Entity RecordType { get { return  Global.Vehicle; } }
    }
}

保存と取得が簡単になりました。

//insert as just vehicle.RecordType

//select as (Entity)reader.GetInt32(index)
于 2013-02-20T07:58:54.333 に答える