我目前手動推出我自己的Dto類和Datacontext,而不是使用從Linq到Sql的自動生成的代碼文件。爲了給出我的解決方案架構/建模背景,我有一個「合同」項目和一個「Dal」項目。 (也是一個「模型」項目,但我會盡力只關注Dal)。手動滾動我自己的Dtos和Datacontext,使所有事情變得更小更簡單,我將舉幾個例子來說明我如何在這裏做到這一點。
我從來沒有返回Dal以外的Dto對象,實際上我一定要聲明它們是內部的。我將它們退出的方式是將它們作爲接口(接口位於我的「合同」層)。我們將製作一個實現「IPersonRetriever和IPersonSaver」接口的簡單「PersonRepository」。
合同:
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();
}
}
}
PersonDataContext:
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
}
您需要將 「列」 屬性添加到您的所有DTO的屬性,但如果您注意到,如果您希望字段在界面上顯示的內容與您想要顯示的字段之間存在一對一的關係,實際表列的名稱,您不需要添加任何命名參數。在這個例子中,我在數據庫中的PersonId被存儲爲「PersonIdentityId」,但我只想讓我的界面將該字段設置爲「Id」。
這就是我如何做我的Dal層,我相信這層應該是愚蠢的,真正的愚蠢。愚蠢的是,它僅存在於CRUD(創建,檢索,更新和刪除)操作中。所有的業務邏輯將進入我的「模型」項目,這將消耗和利用IPersonSaver和IPersonRetriever接口。
希望這會有所幫助!
這樣做更有意義。但我有這個問題,它是如何利用自動生成類的功能?看起來,如果你想有一個良好的分離,那麼仍然有很多管道工要做。 – Aur 2011-03-30 04:15:04
如果你走這條路線,你確實需要做很多事情,這就是爲什麼我自己不使用自動生成的類。像這樣手動滾動它們使得我的觀點更容易閱讀,代碼更少,體積更小,更易於調試,更好的分離等。 – 2011-03-30 14:09:08
因此,主要使用linq來幫助從存儲過程中抽象出來,並使得基本crud操作更容易。好吧,這很有意義。我一直在尋找泛型來試圖找出是否可以用來幫助減少代碼重複。 – Aur 2011-03-30 23:39:02