English 中文(简体)
B. 避免出现流行病领域模式的欧洲实体
原标题:ObjectContext aware entity in EF to avoid Anemic Domain Model

在《实体框架》中,框架能否将DbContext注入附属于或从背景中检索的每一物体(实体)?

I m a NHibernate guy,我知道,如果在欧安论坛世界中这是一个老大难的问题,那么在恩赫,那是可能的。

基本上,我想要一些实体拥有DbContext类财产,只要我把该实体与这一背景联系起来,就由框架本身加以确定。 理想的情况是,这种班级的标志是IContext。 意识到标识接口或类似内容。

我之所以要这样做,是因为(过去)我想避免一段时间内出现流行病领域示范反主。 我的印象是,如果我向实体注入了反对案文,它们将能够进入非行,从而使我能够提出问询,并在各界内部进行更加复杂的逻辑权。 如果你知道实现我目标的其他途径(如在网站浏览中),请这样做,但请设法避免回答像“你这样做是因为这样做”。 感谢!

最佳回答

你们不要这样做,因为你想要把持续的关切从你们的域名中删除?

但是,如果您是“安全”的话,你可以看一看“目标”下发射的物体。 在CTP5中,你需要把你的DbContext像样放在你们的构造中:

((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
    this.ObjectContext_OnObjectMaterialized;

接着执行职务 反对: 活动Args e。 通过这次活动,你将能够接触到刚刚实现的目标。 从那以后,你可以确定贵组织的目标,即公共或内部财产。

问题回答

除了将贵领域与具体援助技术混为一谈外,还有其他的支持者在这种层次上注射了这一背景。 例如,你所介绍的情况是怎样的,每个实体的这种情形是否总是有相同的寿命?

我理解你想要界定各实体的业务方法,因此,你可以说<条码>。 但是,在申请中不必写上这一级的业务逻辑,还有其他办法可以这样做。 例如,你可以利用商务活动。 例如:

public class Customer
{
    public void MakeCustomerPreferred()
    {
        var e = new MakeCustomerPreferredEvent()
        {
            Customer = this
        };

        DomainEvents.Current.Handle(e);
    }
}

public interface IDomainEvent { }

public interface IHandle<T> where T : IDomainEvent
{
    void Handle(T instance);
}

public class MakeCustomerPreferredEvent : IDomainEvent
{
    prop Customer Customer { get; set; }
}

www.un.org/Depts/DGACM/index_french.htm 课程是:ambient context,使您能够接触到所有从事特定活动的人,执行这些活动。

public class DomainEvents
{
    public static DomainEvents Current = new DomainEvents();

    public virtual void Handle<T>(T instance) 
        where T : IDomainEvent
    {
        var handlers =
           YourIocContainer.GetAllInstances<IHandle<T>>();

        foreach (var handler in handlers)
        {
            handler.Handle(instance);
        }
    }
}

有了这种安排,你就可以在你的架构中,在更高的层次上界定您的操作员,在每场业务活动中,可以确定一个或多个操作员。 你们可以在手里注入这个背景。

我们向我们的客户提供一种选择,即采用专题开端人所要求的办法。 为了做到这一点,我们甚至在我国的eXpressApp框架(XAF)产品中实施了类似的解决办法(目标材料和其他目标内容)。 这在大多数情况下没有任何问题,因为各实体的寿命与“案文”相同。 这也有助于我们提高客户在设计其数据模式和业务逻辑时面临同样困难的可用性。

就我们而言,这个领域模式并不伴有具体的持久性技术,因为我们对管理环境有一个特殊的“空间”摘要(除了实体框架之外,我们的产品支持我们内部的办公室管理——电子Xpress Persistent Object(XPO))。

因此,我们向客户提供国际宇宙空间链接接口(拥有单一宇宙空间物体财产),该接口应由需要商业逻辑背景的实体实施。

此外,我们还提供了一种第九聋,人。 针对最受欢迎的商业规则,目标接口(与OnCreated、OnLoaded、OnSaving方法) 举例来说,一个实体实施《英国刑法》的两种接口:

        // IObjectSpaceLink
    IObjectSpace IObjectSpaceLink.ObjectSpace {
        get { return objectSpace; }
        set { objectSpace = value; }
    }

    // IXafEntityObject
    void IXafEntityObject.OnCreated() {
        KpiInstance kpiInstance = (KpiInstance)objectSpace.CreateObject(typeof(KpiInstance));
        kpiInstance.KpiDefinition = this;
        KpiInstances.Add(kpiInstance);
        Range = DevExpress.ExpressApp.Kpi.DateRangeRepository.FindRange("Now");
        RangeToCompare = DevExpress.ExpressApp.Kpi.DateRangeRepository.FindRange("Now");
    }
    void IXafEntityObject.OnSaving() {}
    void IXafEntityObject.OnLoaded() {}

而这里则是我们框架的法典,这些内容是内部的(下文是实体框架6)。

        private void ObjectContext_SavingChanges(Object sender, EventArgs e) {
        IList modifiedObjects = GetModifiedObjects();
        foreach(Object obj in modifiedObjects) {
            if(obj is IXafEntityObject) {
                ((IXafEntityObject)obj).OnSaving();
            }
        }
    }
    private void ObjectContext_ObjectMaterialized(Object sender, ObjectMaterializedEventArgs e) {
        if(e.Entity is IXafEntityObject) {
            ((IXafEntityObject)e.Entity).OnLoaded();
        }
    }
    private void ObjectStateManager_ObjectStateManagerChanged(Object sender, CollectionChangeEventArgs e) {
        if(e.Action == CollectionChangeAction.Add) {
            if(e.Element is INotifyPropertyChanged) {
                ((INotifyPropertyChanged)e.Element).PropertyChanged += new PropertyChangedEventHandler(Object_PropertyChanged);
            }
            if(e.Element is IObjectSpaceLink) {
                ((IObjectSpaceLink)e.Element).ObjectSpace = this;
            }
        }
        else if(e.Action == CollectionChangeAction.Remove) {
            if(e.Element is INotifyPropertyChanged) {
                ((INotifyPropertyChanged)e.Element).PropertyChanged -= new PropertyChangedEventHandler(Object_PropertyChanged);
            }
            if(e.Element is IObjectSpaceLink) {
                ((IObjectSpaceLink)e.Element).ObjectSpace = null;
            }
        }
        OnObjectStateManagerChanged(e);
    }
    public virtual Object CreateObject(Type type) {
        Guard.ArgumentNotNull(type, "type");
        CheckIsDisposed();
        Object obj = CreateObjectCore(type);
        if(obj is IXafEntityObject) {
            ((IXafEntityObject)obj).OnCreated();
        }
        SetModified(obj);
        return obj;
    }

我希望这一信息有助于你。





相关问题
Codeigniter WHERE on "AS" field

I have a query where I need to modify the selected data and I want to limit my results of that data. For instance: SELECT table_id, radians( 25 ) AS rad FROM test_table WHERE rad < 5 ORDER BY rad ...

Problem find joined table in rails

I have model represent association rule (Body => Head) def Item has_many :heads has_many :bodies ... end def Rule has_many :heads has_many :bodies ... end def Body belongs_to :item belongs_to :rule ...

FreeTDS Bad token from the server (SQL Server)

Today we had a lot more activity than normal between our Ruby on Rails application and our remote legacy SQL Server 2005 database, and we started getting the error below intermittently. What is is? ...

Castle ActiveRecord: one-to-one

While playing around with one-to-one associations in castle activerecord I stumbled upon the following problem: I m trying to model a one-to-one relationship (user-userprofile in this case). I ...

Sending email updates: model or observer?

I have an Event model, which stores an event feed for each user. I also need to email the updates to users which have enabled email notifications in their profile. From an architectural point of view,...

activerecord has_many :through find with one sql call

I have a these 3 models: class User < ActiveRecord::Base has_many :permissions, :dependent => :destroy has_many :roles, :through => :permissions end class Permission < ActiveRecord::...

热门标签