obase社区Obase开发者QQ群:962698871
obase

欢迎查阅
OBASE帮助文档

我们之前在开始使用的再攀高峰一节中介绍过如何定义变更通知模块,即先在上下文配置提供者中的返回自己定义的通知队列并且对要通知的实体型或关联型定义通知操作的附加点。 这里是之前给出的变更通知配置:

//注册学生实体
var studentConfiguration = modelBuilder.Entity<Student>();
//配置要通知的属性
studentConfiguration.HasNoticeAttributes(new List<string>(){"Name"});
//是否在创建时通知
studentConfiguration.HasNotifyCreation(true);
//是否在修改时通知
studentConfiguration.HasNotifyUpdate(true);
//是否在删除时通知
studentConfiguration.HasNotifyDeletion(true);

在这些配置中,我们注册了Student作为实体模型。使用HasNoticeAttributes方法为Student配置了要通知的属性(Name),剩余的三个方法是指示在实体发生何种改变时(创建,删除,修改)进行通知的发送。

在新建对象并使用Attach方法附加至Objetset后,SaveChanges会触发Creation类型的ObjectChangeNotice;在修改对象后SaveChanges会触发Update类型的ObjectChangeNotice,在Remove后SaveChanges会触发Deletion类型的ObjectChangeNotice。 ObjectChangeNotice是一个结构,会被序列化成二进制形式后调用实现了IMessageQueue的MessageQueue的SendMessage(byte[] msg)方法,此结构的定义如下:

/// <summary>
///     对象变更通知数据结构
/// </summary>
[Serializable]
public struct ObjectChangeNotice
{
    /// <summary>
    ///     对象的属性及其取值
    /// </summary>
    public List<ObjectAttributeValue> Attributes { get; set; }

    /// <summary>
    ///     变更行为,可以取“Creation”、“Update”、“Deletion”三个值
    /// </summary>
    public string ChangeAction { get; set; }

    /// <summary>
    ///     对象的标识
    /// </summary>
    public List<ObjectAttributeValue> ObjectKey { get; set; }

    /// <summary>
    ///     对象类型的名称
    /// </summary>
    public string ObjectType { get; set; }

    /// <summary>
    ///     对象类型的命名空间
    /// </summary>
    public string ObjectTypeNamespace { get; set; }

    /// <summary>
    ///     转换为字符串表示形式
    /// </summary>
    /// <returns></returns>
    public override string ToString()
    {
        return
            $"ObjectChangeNotice:{{Attributes-[{string.Join(",", Attributes)}],ChangeAction-\"{ChangeAction}\",ObjectType-\"{ObjectType}\",ObjectTypeNamespace-\"{ObjectTypeNamespace}\"}}";
    }
}

此通知是使用BinaryFormatter序列化的,其中属性访问器的具体定义可以参考注释。

而使用直接修改方法则会发送DirectlyChangeNotice通知,使用Delete方法会发送eDirectlyChangeType.Delete类型的DirectlyChangeNotice;使用SetAttribute方法会发送eDirectlyChangeType.Update类型的DirectlyChangeNotice;使用IncreaseAttribute方法会发送eDirectlyChangeType.Increment类型的DirectlyChangeNotice。 DirectlyChangeNotice是一个结构,会被序列化成二进制形式后调用实现了IMessageQueue的SendMessage(byte[] msg)方法,此结构的定义如下:

/// <summary>
///     就地修改通知
/// </summary>
[Serializable]
public struct DirectlyChangeNotice
{
    /// <summary>
    ///     筛选条件表达式
    /// </summary>
    public string Expression { get; set; }

    /// <summary>
    ///     对象类型名称
    /// </summary>
    public string ObjectType { get; set; }

    /// <summary>
    ///     对象类型的命名空间
    /// </summary>
    public string ObjectTypeNamespace { get; set; }

    /// <summary>
    ///     新值键值对
    /// </summary>
    public Dictionary<string, object> NewValues { get; set; }

    /// <summary>
    ///     就地修改类型
    /// </summary>
    public eDirectlyChangeType DirectlyChangeType { get; set; }
}

此通知是使用BinaryFormatter序列化的,其中属性访问器的具体定义可以参考注释。

这些通知会在我们自定义的实现了IMessageQueue的MessageQueue的 SendMessage(byte[])方法中根据我们的逻辑发送到指定的接收者(如消息队列等中间件)里,之后只要从这些接收者内取出即可获取到这些通知。

没有找到您需要的文档?

您还可以通过人工服务在线咨询,服务时间为每天上午9点至下午6点。

If you can't find required answer, get in touch with us online. We provide service from 9:00 to 18:00.

让编程成为一件快乐的事
现在开始