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在我的应用程序项目中。在这种情况下,什么是更好的设计?

我有两种方法可以解决,但不确定这是否是正确的方法。

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 模板时,我发现它比需要的更复杂。我采用了第二种方法并进行了一些修改。

方法问题Enum

  1. 我可以System.Enum直接保存(Convert.ToInt32(System.Enum)System.Enum.ToString()可以给出实际的基础值)到 db 但我将无法从 db 中干净地检索它作为System.Enum.

  2. System.Enum是完全通用的,可能会令人困惑,因为它什么也没透露。

我采用了第二种方法,但稍作修改:

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 回答