使用自定义 C# 属性来选择 Fluent 约定

发布于 2024-09-09 07:14:20 字数 294 浏览 2 评论 0原文

假设您有一组适用于特定映射组的 Fluent 约定,但不适用于所有映射组。

我的想法是,我将创建可应用于 Fluent *Map 类的自定义 C# 属性 - 并编写约定,通过检查 *Map 类以查看是否应用了自定义属性来确定接受。

这样,我可以选择约定组并将它们应用到各种映射,只需使用自定义属性标记它们 - [UseShortNamingConvention] 等。

我是 NHibernate(以及 Fluent 和 C# 的新手) - 这是这种方法可能的?

这是理智的吗? :-)

谢谢!

Suppose you have sets of Fluent conventions that apply to specific groups of mappings, but not to all of them.

My thought here was, I'll create custom C# attributes that I can apply to the Fluent *Map classes - and write conventions that determine acceptance by inspecting the *Map class to see if the custom attribute was applied.

That way, I can select groups of conventions and apply them to various mappings by just tagging them with a custom attribute - [UseShortNamingConvention], etc.

I'm new to NHibernate (and Fluent, and C# for that matter) - is this approach possible?

And is it sane? :-)

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

身边 2024-09-16 07:14:20

是的!我实际上做了类似的事情,但是使用了标记接口(INotCacheable、IComponent),但是标记接口或属性应该没有那么大的区别。

当应用您的约定时,只需检查您的属性是否存在并且您的状态良好:)

编辑:

添加一些代码示例

    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();
        }
}

Yes it is! Ive actually done something similiar but went with Marker Interfaces instead (INotCacheable, IComponent), but Marker Interface or Attribute, should't be that much of a difference.

When applying your conventions, just check for the presence of your attribute and ur good :)

EDIT:

Adding some code samples

    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();
        }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文