OCL для оценки атрибута строки как OCL в MDriven?

У меня есть класс, который имеет несколько строковых атрибутов, которые содержат выражения OCL. Мне нужно запросить эти объекты в OCL, и в этом OCL мне нужно оценить выражение OCL в одном из атрибутов.

Можно ли это сделать?

Я думаю, что я ищу операцию OCL, как <<object>>.eval(<<string>>), где <<string>> будет оцениваться в контексте <<object>>и предпочтительно любые переменные OCL в окружающем OCL будут наследоваться, поэтому на них можно ссылаться с помощью выражения OCL в <<string>>,

В качестве обходного пути, я полагаю, я мог бы добавить дополнительный атрибут, полученный из кода, который оценивает OCL атрибута в контексте объекта (этого может быть достаточно).

2 ответа

Решение

Невозможно оценить ocl/eal из самого ocl/eal. Это было предложено, но за него проголосовали из-за последствий для безопасности и аргумента "самоизменяющийся код действительно странный".

Простой обходной путь в MDriven для Visual Studio - добавить метод Eval в свой суперкласс - и реализовать его в C# - и использовать этот вызов ocl или eal service.

Я полагаю, вы можете сделать так, чтобы метод Eval возвращал 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.");
        }
    }
}

Вызовите этот установщик в конструкторе ecospace:

OclInstaller.InstallOclOperations(this);

Удивительно, как легко с MDriven добавлять новые пользовательские операции OCL. Как говорит Ганс, невозможно оценить OCL "из коробки", но вы можете написать свой собственный оценщик. Но, пожалуйста, сделайте шаг назад и примите правильное архитектурное решение о том, как вы реализуете свою функцию.

Вы также можете добавить собственные экоуслуги, но это совершенно другая история.

Другие вопросы по тегам