我目前手动滚动我自己的 Dto 类和 Datacontext,而不是使用从 Linq 到 Sql 的自动生成的代码文件。为了提供我的解决方案架构/建模的一些背景,我有一个“合同”项目和一个“Dal”项目。(也是一个“模型”项目,但我会尽量只关注 Dal)。手动滚动我自己的 Dtos 和 Datacontext,使一切变得更小更简单,我将在这里举几个例子来说明我是如何做到的。
我从不返回 Dal 之外的 Dto 对象,事实上我确保将它们声明为内部的。我将它们返回的方式是将它们转换为接口(接口位于我的“合同”层中)。我们将创建一个简单的“PersonRepository”,实现“IPersonRetriever 和 IPersonSaver”接口。
合同:
public interface IPersonRetriever
{
IPerson GetPersonById(Guid personId);
}
public interface IPersonSaver
{
void SavePerson(IPerson person);
}
达尔:
public class PersonRepository : IPersonSaver, IPersonRetriever
{
private string _connectionString;
public PersonRepository(string connectionString)
{
_connectionString = connectionString;
}
IPerson IPersonRetriever.GetPersonById(Guid id)
{
using (var dc = new PersonDataContext(_connectionString))
{
return dc.PersonDtos.FirstOrDefault(p => p.PersonId == id);
}
}
void IPersonSaver.SavePerson(IPerson person)
{
using (var dc = new PersonDataContext(_connectionString))
{
var personDto = new PersonDto
{
Id = person.Id,
FirstName = person.FirstName,
Age = person.Age
};
dc.PersonDtos.InsertOnSubmit(personDto);
dc.SubmitChanges();
}
}
}
个人数据上下文:
internal class PersonDataContext : System.Data.Linq.DataContext
{
static MappingSource _mappingSource = new AttributeMappingSource(); // necessary for pre-compiled linq queries in .Net 4.0+
internal PersonDataContext(string connectionString) : base(connectionString, _mappingSource) { }
internal Table<PersonDto> PersonDtos { get { return GetTable<PersonDto>(); } }
}
[Table(Name = "dbo.Persons")]
internal class PersonDto : IPerson
{
[Column(Name = "PersonIdentityId", IsPrimaryKey = true, IsDbGenerated = false)]
internal Guid Id { get; set; }
[Column]
internal string FirstName { get; set; }
[Column]
internal int Age { get; set; }
#region IPerson implementation
Guid IPerson.Id { get { return this.Id; } }
string IPerson.FirstName { get { return this.FirstName; } }
int IPerson.Age { get { return this.Age; } }
#endregion
}
您需要将“Column”属性添加到所有 Dto 属性,但如果您注意到,如果您希望在界面上公开的字段与名称之间存在一对一的关联实际的表列,您不需要添加任何命名参数。在此示例中,我在数据库中的 PersonId 存储为“PersonIdentityId”,但我只希望我的界面使该字段显示为“Id”。
这就是我做 Dal 层的方式,我相信这个层应该是愚蠢的,真正的愚蠢。从某种意义上说,它仅用于 CRUD(创建、检索、更新和删除)操作是愚蠢的。所有业务逻辑都将进入我的“模型”项目,该项目将使用和利用 IPersonSaver 和 IPersonRetriever 接口。
希望这可以帮助!