EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

非持久对象

非持久类是业务类的一种。XAF会为此类生成UI,但不会将其绑定到应用程序的数据库表。您可以使用此类显示列表或详细信息视图,其中包含以代码生成或从存储中加载的临时数据。您也可以使用它来显示一个空白的视图(对话框)并处理用户的输入。

重要笔记

基本的非持久类实现

模块项目中声明一个常规类,并使用DomainComponentAttribute装饰它以实现非持久类。

using DevExpress.ExpressApp.DC;
// ...
[DomainComponent]
public class MyNonPersistentObject {
    public string Name { get; set; }
    public string Description { get; set; }
}

XAF会在Types Info Subsystem中使用该属性自动注册该类,并将其添加到Application Model中。重建解决方案并打开“模型编辑器”,以确保XAF将类添加到BOModel节点并创建了相应的“列表”视图和“详细视图”。

NonPersistentObjectModel

XAF可以在PopupWindowShowAction的弹出对话框中显示MyNonPersistentObject的Detail视图(请参阅“添加显示弹出窗口的动作”主题)。

MyNonPersistentObjectPopup

您还可以使用ActionAttribute来显示非持久对象的弹出窗口。为此,请将此属性应用于采用非持久类型参数的业务类的方法。

例子:

非持久对象空间

NonPersistentObjectSpace是一个对象空间,用于管理应用程序中的非持久对象实例。如果XafApplication对象支持此对象空间类型,则可以从代码创建,读取或更新非持久对象实例。若要支持此对象空间类型,请将以下代码添加到WinApplication.cs(WinApplication.vb),WebApplication.cs(WebApplication.vb)和/或MobileApplication.cs(MobileApplication.vb)文件中的重写的CreateDefaultObjectSpaceProvider方法中(此外)到现有的XPObjectSpaceProvider或EFObjectSpaceProvider注册)。

protected override void CreateDefaultObjectSpaceProvider(CreateCustomObjectSpaceProviderEventArgs args) {
    // ...
    args.ObjectSpaceProviders.Add(new NonPersistentObjectSpaceProvider(TypesInfo, null));
}

请注意,解决方案向导会自动添加上面的代码。

XAF将第一个注册的对象空间提供程序用于以下目的:

确保NonPersistentObjectSpaceProvider不是您的应用程序中的第一个注册的Provider。

重点

NonPersistentObjectSpace无法处理持久对象。为持久对象类型创建一个附加的对象空间,然后将此对象空间添加到NonPersistentObjectSpace.AdditionalObjectSpaces集合中,以允许处理持久对象。有关更多信息,请参考如何:在非持久性对象的视图中显示持久性对象

NonPersistentObjectSpace时出现的对象空间载荷非持久对象类公开事件。您可以处理以下事件,以将数据提供给非持久对象:

您可以使用“新建”,“删除”和“保存操作”来修改已加载的非持久对象。该NonPersistentObjectSpace.ModifiedObjects属性提供修改的对象。使用CreateObjectSpace(Type)方法创建对象空间并管理代码中的非持久对象(例如,在Controller的代码中):

using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
// ...
public class ShowDetailViewController : ViewController<ListView> {
    // ...
    void showDetailViewAction_CustomizePopupWindowParams(
        object sender, CustomizePopupWindowParamsEventArgs e) {
        IObjectSpace newObjectSpace = Application.CreateObjectSpace(typeof(NonPersistentObject));
        // ...
    }
}

例子

关键属性

在XAF ASP.NET和Mobile应用程序中,业务对象应具有一个关键属性,以正确显示在列表视图中。

在ASP.NET应用程序中,每个ASPxGridView控件的行应具有唯一的key。选择,过滤,排序和分组操作以及依赖于它们的标准XAF功能是必需的。如果要使用NonPersistentObjectSpace.ObjectByKeyGetting事件通过键访问非持久对象,则还需要key属性。

在移动应用程序中,键值包含在客户端应用程序发送的接收非持久对象的请求中(例如,从列表视图显示详细视图时)。处理NonPersistentObjectSpace.ObjectByKeyGetting事件,以将适当的对象传递给客户端应用程序。

使用KeyAttribute声明密钥属性。该BrowsableAttribute允许您隐藏UI这个属性。以下代码段演示了如何在非持久类中声明key属性:

[DomainComponent]
public class NonPersistentObject {
    [Browsable(false)]
    [DevExpress.ExpressApp.Data.Key]
    public int Oid { get; set; }
    // ...
}
重点

仅从DevExpress.ExpressApp.Data命名空间使用Key属性(不能从System.ComponentModel.DataAnnotations或DevExpress.Xpo命名空间使用)。

您可以允许用户从导航中打开特定的非持久对象实例:

  1. 在导航中添加一个项目。将其IModelNavigationItem.View属性设置为非持久对象的DetailView的标识符,并将IModelNavigationItem.ObjectKey设置为任意整数值。

    非持久密钥

  2. 创建一个WindowController后代。在NonPersistentObjectSpace.ObjectByKeyGetting事件处理程序中,获取一个对象实例,该实例的键值与模型编辑器中导航项的ObjectKey属性值一致。

示例: 如何:从导航中显示非持久对象的详细信息视图

INotifyPropertyChanged支持

在非持久类中实现INotifyPropertyChanged接口,以使用XAF功能来跟踪和处理属性值更改(例如,Conditional Appearance)。从属性的setter调用OnPropertyChanged方法以触发PropertyChanged事件。对象空间在内部处理此事件。该的PropertyChanged事件触发IObjectSpace.ObjectChanged事件。

例如: 如何:非持久化对象执行CRUD操作| 业务类中的PropertyChanged事件

IXafEntityObject和IObjectSpaceLink支持

实现IXafEntityObject接口,以将自定义业务逻辑添加到非持久类代码。此接口声明在对象空间创建,加载或保存对象时调用的方法。您还可以实现IObjectSpaceLink接口,并使用IObjectSpaceLink.ObjectSpace属性返回的对象空间。这使您可以查询同一对象空间中的其他对象。

using DevExpress.ExpressApp;
// ...
[DomainComponent]
public class MyNonPersistentObject : IXafEntityObject, IObjectSpaceLink{
    // ...
    void IXafEntityObject.OnCreated() {
        // Place the entity initialization code here.
        // You can initialize reference properties using Object Space methods; e.g.:
        // this.Address = objectSpace.CreateObject<Address>();
    }
    void IXafEntityObject.OnLoaded() {
        // Place the code that is executed each time the entity is loaded here.
    }
    void IXafEntityObject.OnSaving() {
        // Place the code that is executed each time the entity is saved here.
    }
    IObjectSpace IObjectSpaceLink.ObjectSpace {
        get { return objectSpace; }
        set { objectSpace = value; }
    }
}

示例: 如何:对非持久对象执行CRUD操作

非持久对象模板

您可以使用Visual Studio模板创建非持久类。为此,请打开“模板库”,切换到“ XAF”类别,然后选择“ XAF业务对象” | “ XAF业务对象”。非持久对象项。可以在本主题中列出的不同复杂场景中使用添加的类。

NonPersistentObjectTemplate

该非持久类包括IXafEntityObjectIObjectSpaceLinkINotifyPropertyChanged接口实现以及整数类型键属性。

相关文章

转载保留此链接,注明出处