例如,我有以下域模型:
class Order {
public virtual int Id {get; protected set;}
public virtual BaseStatus Status {get; set;}
}
abstract class BaseStatus {
public virtual int Id {get; protected set;}
public abstract string Name {get;}
}
class Approved : BaseStatus {
public override string Name
{
get { return "Approved"; }
}
}
所以现在我不想要的是两个表,Orders
和Statuses
。 Orders表将包含StatusId
列。
问题是关于改变订单状态的API。如果我执行以下操作:
order.Status = new Approved();
这将导致在状态表中创建新行。 目前我已经创建了以下帮助器:
class StatusesFactory {
ISession session;
public StatusesFactory(ISession session){
this.session = session;
}
public GetStatus<T> where T : BaseStatus, new() {
T status = session.QueryOver<T>.SingleOrDefault();
if(status == null){
status = new T();
session.SaveOrUpdate(status);
}
return status;
}
}
当我想设置状态时,我正在使用这样的代码:
order.Status = statusesFactory.GetStatus<Approved>();
似乎工作正常,但没有理由变得复杂。我正在使用NHibernate,但我认为同样的问题可能适用于任何ORM。这样的事情的原因是在空数据库上轻松部署,以便在第一次请求时填充。
我在这里看到的一个问题是,当我需要获得所有可能的状态时,我无法使用以下代码:
session.QueryOver()列表();
因为并非所有状态都可以创建。 你觉得怎么样?
答案 0 :(得分:1)
我认为你的Approved-class应该使用单例模式,因为只有一个Approved-state ...
所有现有状态与所有可能状态的列表有点困难......可能的状态取决于从BaseState继承的类...我不知道如何快速找到它们,因为它们没有驻留在当前程序集中,甚至是在加载的程序集中...你应该考虑BaseStatus中所有子类单例对象的静态列表......