Использование пользовательских атрибутов C # для выбора соглашений Fluent - PullRequest
1 голос
/ 14 июля 2010

Предположим, у вас есть наборы соглашений Fluent, которые применяются к определенным группам отображений, но не ко всем из них.

Я подумал, что я создам пользовательские атрибуты C #, которые можно применять к Fluent* Классы карты - и написание соглашений, определяющих принятие, проверяя класс * Map, чтобы увидеть, был ли применен пользовательский атрибут.

Таким образом, я могу выбирать группы соглашений и применять их к различным сопоставлениям, просто помечая ихс пользовательским атрибутом - [UseShortNamingConvention] и т. д.

Я новичок в NHibernate (и Fluent, и C # в этом отношении) - возможен ли такой подход?

И это нормально?: -)

Спасибо!

1 Ответ

2 голосов
/ 14 июля 2010

Да, это так!Я действительно сделал что-то похожее, но вместо этого использовал Marker Interfaces (INotCacheable, IComponent), но Marker Interface или Attribute не должны сильно отличаться.

При применении ваших соглашений просто проверьте наличиеваш атрибут и ваш хороший:)

РЕДАКТИРОВАТЬ:

Добавление некоторых примеров кода

    public class MyMappingConventions : IReferenceConvention, IClassConvention
    {
        public void Apply(IOneToManyCollectionInstance instance)
        {
            instance.Key.Column(instance.EntityType.Name + "ID");
            instance.LazyLoad();
            instance.Inverse();
            instance.Cascade.SaveUpdate();

            if ((typeof(INotCacheable).IsAssignableFrom(instance.Relationship.Class.GetUnderlyingSystemType())))
                return;

            instance.Cache.ReadWrite();
        }

        public void Apply(IClassInstance instance)
        {
            instance.Table(instance.EntityType.Name + "s");
            //If inheriting from IIMutable make it readonly
            if ((typeof(IImmutable).IsAssignableFrom(instance.EntityType)))
                instance.ReadOnly();

            //If not cacheable
            if ((typeof(INotCacheable).IsAssignableFrom(instance.EntityType)))
                return;

            instance.Cache.ReadWrite();
        }
}
...