OCL 将字符串属性评估为 MDriven 中的 OCL?
OCL to evaluate string attribute as OCL in MDriven?
我有一个 class,它有几个包含 OCL 表达式的字符串属性。我需要查询 OCL 中的那些对象,并且在那个 OCL 中我需要计算其中一个属性中的 OCL 表达式。
这可以做到吗?
我想我正在寻找像 <<object>>.eval(<<string>>)
这样的 OCL 操作,其中 <<string>>
将在 <<object>>
的上下文中进行评估,最好是周围 OCL 中的任何 OCL 变量将被继承,因此它们可以被 <<string>>
.
中的 OCL 表达式引用
作为解决方法,我想我可以添加一个代码派生的额外属性,该属性在对象的上下文中评估属性的 OCL(这可能就足够了)。
无法从 ocl/eal 本身内部评估 ocl/eal。有人建议但由于安全隐患和自修改代码确实很奇怪的论点而被否决。
MDriven 中 Visual Studio 的简单解决方法是在您的超类上添加一个 Eval 方法 - 并在 c# 中实现它 - 并调用 ocl 或 eal 服务。
我猜你可以让 Eval 方法 return 一个 Collection(SuperClass) 或 SuperClass 如果你想对结果采取行动
您可以编写自定义 OCL 操作。举个例子:
[EcoOclOperation(typeof(OclEcoId), true)]
public class OclEcoId : OclOperationBase
{
/// <summary>
/// Initialisation of the OCL funktion
/// </summary>
protected override void Init()
{
var parameter = new IOclType[1]
{
this.Support.ObjectType,
};
this.InternalInit("EcoId", parameter, this.Support.IntegerType);
}
/// <summary>
/// Implementation of the OCL function
/// </summary>
/// <param name="parameters">OCL parameters</param>
public override void Evaluate(IOclOperationParameters parameters)
{
var iObject = parameters.Values[0].Element as IObject;
if (iObject != null && iObject.AsObject != null)
{
var ecoid = iObject.EcoID();
this.Support.MakeNewInteger(parameters.Result, int.Parse(ecoid));
}
}
}
此类操作必须像这样安装到 EcoSpace 中:
public static class OclInstaller
{
/// <summary>
/// InstallOclOperations
/// </summary>
/// <param name="ecoSpace">The EcoSpaceparam>
public static void InstallOclOperations(EcoSpace ecoSpace)
{
if (ecoSpace != null)
{
var ocls = ecoSpace.GetEcoService<IOclService>();
var eals = ecoSpace.GetEcoService<IActionLanguageService>();
// Install all available operations in current assembly
foreach (Type t in System.Reflection.Assembly.GetAssembly(typeof(OclInstaller)).GetTypes())
{
if (t.BaseType == typeof(OclOperationBase))
{
var op = (OclOperationBase)Activator.CreateInstance(t);
eals.InstallOperation(op);
object[] attributes = t.GetCustomAttributes(typeof(EcoOclOperationAttribute), false);
if (attributes.Length == 1)
{
if ((attributes[0] as EcoOclOperationAttribute).IsQuery)
{
ocls.InstallOperation(op);
}
}
else
{
ocls.InstallOperation(op);
}
}
}
}
else
{
throw new NullReferenceException("Error in [InstallOclOperations]: EcoSpace is null.");
}
}
}
在生态空间的构造函数中调用此安装程序:
OclInstaller.InstallOclOperations(this);
令人惊奇的是,使用 MDriven 添加新的自定义 OCL 操作是多么容易。正如 Hans 所说,开箱即用地评估 OCL 是不可能的,但您可以编写自己的评估程序。但请退后一步,对实现功能的方式做出适当的架构决定。
您也可以添加自定义生态服务,但这是完全不同的情况。
我有一个 class,它有几个包含 OCL 表达式的字符串属性。我需要查询 OCL 中的那些对象,并且在那个 OCL 中我需要计算其中一个属性中的 OCL 表达式。
这可以做到吗?
我想我正在寻找像 <<object>>.eval(<<string>>)
这样的 OCL 操作,其中 <<string>>
将在 <<object>>
的上下文中进行评估,最好是周围 OCL 中的任何 OCL 变量将被继承,因此它们可以被 <<string>>
.
作为解决方法,我想我可以添加一个代码派生的额外属性,该属性在对象的上下文中评估属性的 OCL(这可能就足够了)。
无法从 ocl/eal 本身内部评估 ocl/eal。有人建议但由于安全隐患和自修改代码确实很奇怪的论点而被否决。
MDriven 中 Visual Studio 的简单解决方法是在您的超类上添加一个 Eval 方法 - 并在 c# 中实现它 - 并调用 ocl 或 eal 服务。
我猜你可以让 Eval 方法 return 一个 Collection(SuperClass) 或 SuperClass 如果你想对结果采取行动
您可以编写自定义 OCL 操作。举个例子:
[EcoOclOperation(typeof(OclEcoId), true)]
public class OclEcoId : OclOperationBase
{
/// <summary>
/// Initialisation of the OCL funktion
/// </summary>
protected override void Init()
{
var parameter = new IOclType[1]
{
this.Support.ObjectType,
};
this.InternalInit("EcoId", parameter, this.Support.IntegerType);
}
/// <summary>
/// Implementation of the OCL function
/// </summary>
/// <param name="parameters">OCL parameters</param>
public override void Evaluate(IOclOperationParameters parameters)
{
var iObject = parameters.Values[0].Element as IObject;
if (iObject != null && iObject.AsObject != null)
{
var ecoid = iObject.EcoID();
this.Support.MakeNewInteger(parameters.Result, int.Parse(ecoid));
}
}
}
此类操作必须像这样安装到 EcoSpace 中:
public static class OclInstaller
{
/// <summary>
/// InstallOclOperations
/// </summary>
/// <param name="ecoSpace">The EcoSpaceparam>
public static void InstallOclOperations(EcoSpace ecoSpace)
{
if (ecoSpace != null)
{
var ocls = ecoSpace.GetEcoService<IOclService>();
var eals = ecoSpace.GetEcoService<IActionLanguageService>();
// Install all available operations in current assembly
foreach (Type t in System.Reflection.Assembly.GetAssembly(typeof(OclInstaller)).GetTypes())
{
if (t.BaseType == typeof(OclOperationBase))
{
var op = (OclOperationBase)Activator.CreateInstance(t);
eals.InstallOperation(op);
object[] attributes = t.GetCustomAttributes(typeof(EcoOclOperationAttribute), false);
if (attributes.Length == 1)
{
if ((attributes[0] as EcoOclOperationAttribute).IsQuery)
{
ocls.InstallOperation(op);
}
}
else
{
ocls.InstallOperation(op);
}
}
}
}
else
{
throw new NullReferenceException("Error in [InstallOclOperations]: EcoSpace is null.");
}
}
}
在生态空间的构造函数中调用此安装程序:
OclInstaller.InstallOclOperations(this);
令人惊奇的是,使用 MDriven 添加新的自定义 OCL 操作是多么容易。正如 Hans 所说,开箱即用地评估 OCL 是不可能的,但您可以编写自己的评估程序。但请退后一步,对实现功能的方式做出适当的架构决定。
您也可以添加自定义生态服务,但这是完全不同的情况。