Используя мои собственные атрибуты с Subsonic SimpleRepository - PullRequest
0 голосов
/ 20 июля 2011

Я искал ORM в последнее время, и SubSonic с его SimpleRepository, похоже, является решением, которое я ищу.

Есть ли способ использовать мои собственные атрибуты или атрибуты из System.ComponentModel для управления генерацией SQL? Я хочу, чтобы объекты моей модели / домена были чистыми от сторонних материалов.

1 Ответ

2 голосов
/ 27 июля 2011

Я бы не советовал, но это можно сделать.

Создайте свои собственные атрибуты, которые соответствуют атрибутам SubSonics (например, OrmIgnore вместо SubSonicIgnore, все равно придется реализовать SubSonic.SqlGeneration.Schema.IClassMappingAttribute или SubSonic.SqlGeneration.Schema.IPropertyMappingAttribute или SubSonic.SqlGeneration.Schema.IRelationMappingAttribute

Посмотрите на этот код из SubSonic.Core \ Extensions \ Object.cs, чтобы понять, что происходит

    public static ITable ToSchemaTable(this Type type, IDataProvider provider)
    {

        ...

        var typeAttributes = type.GetCustomAttributes(typeof(IClassMappingAttribute), false);

        foreach (IClassMappingAttribute attr in typeAttributes)
        {
            if (attr.Accept(result))
            {
                attr.Apply(result);
            }
        }

        ...

        // Now work with attributes
        foreach (IPropertyMappingAttribute attr in attributes.Where(x => x is IPropertyMappingAttribute))
        {
            if (attr.Accept(column))
            {
                attr.Apply(column);
            }
        }

        ....

    }

ваша реализация Apply должна изменить схему, чтобы сделатьчто вы хотите. Как этот (из SubSonicDefaultSettingAttribute):

    public void Apply(IColumn column)
    {
        column.DefaultSetting = DefaultSetting;
    }

Вы должны проверить источник SubSonic и пометить каждый пользовательский атрибут как устаревший

[Obsolete("Use OrmIgnore instead", true)]
[AttributeUsage(AttributeTargets.Property)]
public class SubSonicIgnoreAttribute : Attribute { }

Есть несколько прямых ссылок наатрибуты (которые не используют интерфейс), которые вам нужно исправить.

И вам придется искать строковые ссылки

    private static bool ColumnIsIgnored(object[] attributes)
    {
        foreach (var att in attributes)
        {
            if (att.ToString().Equals("SubSonic.SqlGeneration.Schema.SubSonicIgnoreAttribute"))
            {
                return true;
            }
        }

        return false;
    }

с

    private static bool ColumnIsIgnored(object[] attributes)
    {
        foreach (var att in attributes)
        {
            if (att.ToString().EndsWith("OrmIgnoreAttribute"))
            {
                return true;
            }
        }

        return false;
    }
...