C# 使用Fluent NHibernate和ASP.NET MVC的干式模型
我在一个DataAccess项目中有我的Fluent NHibernate设置代码,该项目可以从我的Web应用程序访问 作为NHibernate配置的一部分,我定义了一个映射到数据库时要使用的模型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层中需要传递给视图的模型相同。我还想向这个模型添加一些额外的元数据,例如必需的和显示名称 我相信
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的澄清。非常感谢您对答案的扩展。非常有趣,非常感谢。