Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Fluent NHibernate和ASP.NET MVC的干式模型_C#_Asp.net Mvc 3_Fluent Nhibernate - Fatal编程技术网

C# 使用Fluent NHibernate和ASP.NET MVC的干式模型

C# 使用Fluent NHibernate和ASP.NET MVC的干式模型,c#,asp.net-mvc-3,fluent-nhibernate,C#,Asp.net Mvc 3,Fluent Nhibernate,我在一个DataAccess项目中有我的Fluent NHibernate设置代码,该项目可以从我的Web应用程序访问 作为NHibernate配置的一部分,我定义了一个映射到数据库时要使用的模型 public sealed class MyTypeMapping: ClassMap<MyType> 公共密封类MyTypeMapping:ClassMap 此模型MyType与我在web层中需要传递给视图的模型相同。我还想向这个模型添加一些额外的元数据,例如必需的和显示名称 我相信

我在一个DataAccess项目中有我的Fluent NHibernate设置代码,该项目可以从我的Web应用程序访问

作为NHibernate配置的一部分,我定义了一个映射到数据库时要使用的模型

public sealed class MyTypeMapping: ClassMap<MyType>
公共密封类MyTypeMapping:ClassMap
此模型
MyType
与我在web层中需要传递给视图的模型相同。我还想向这个模型添加一些额外的元数据,例如
必需的
显示名称

我相信这是一个常见的场景,其中数据访问层中的模型与web层中所需的模型相同

这通常是如何处理的?让视图依赖于数据访问层中的模型是一种公认的做法,还是我应该简单地创建一个ViewModel来抽象视图中的细节

我对ORM很陌生,把我的模型放在MVC项目的models文件夹之外感觉很奇怪,而且复制模型也感觉不对劲

你是怎么处理的

使视图依赖于数据访问层中的模型是公认的做法吗

也许对某些人来说,对我来说,不

或者我应该简单地创建一个ViewModel来抽象视图中的细节吗

这就是我要做的

当然,如果你不想按照我的建议使用视图模型,你有几种可能性。因此,假设您有以下域模型:

public class MyDomainModel
{
    public string Foo { get; set; }
}
但您想将一些元数据与之关联

您拥有且内置的第一种可能性是使用该属性:

[MetadataType(typeof(MyDomainModelMetadata))]
public class MyDomainModel
{
    public string Foo { get; set; }
}
并为元数据创建一个单独的类:

public class MyDomainModelMetadata
{
    [Display(Name = "foo bar")]
    public object Foo { get; set; }
}
但您的DAL仍然必须了解元数据和表示逻辑,这不是很好。必须在DAL中定义
MyDomainModelMetadata
类,因为属性表示在编译时烘焙到程序集中的元数据

这就引出了第二种可能性,即编写自定义模型元数据提供程序:

public class MyMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
    {
        // TODO: you could keep a static hashtable that will map between your
        // domain model type and the associated metadata type in your UI layer
        // but for the purpose of this demonstration I have hardcoded them to simplify
        if (containerType == typeof(MyDomainModel))
        {
            return GetMetadataForProperty(
                modelAccessor, 
                typeof(MyDomainModelMetadata), 
                propertyName
            );
        }
        return base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
    }
}
ModelMetadataProviders.Current = new MyMetadataProvider();

现在,您可以去掉域模型上的
MetadataType
属性,并在UI层(MVC应用程序本身)中使用
MyDomainModelMetadata
类。

感谢Darin的澄清。非常感谢您对答案的扩展。非常有趣,非常感谢。