Ich möchte den Repository-Ansatz, der in DDD mit Linq-2-Sql in meiner Portal-App weit verbreitet ist, nachahmen. Bisher habe ich dies:Unit of Work-Muster vs. Transaktionsumfang für Linq-To-Sql?
public class LinqToSqlDal<DC,T>: IDisposable, IRepository<T>
where T: LinqEntity, new(),
where DC: DataContext, new()
{
private DC unitOfWork = null;
public LinqToSqlDal(string connectionString)
{
this.unitOfWork = Activator.CreateInstance(typeof(DC), connectionString) as DC;
}
public LinqToSqlDal(string connectionString, DataLoadOptions loadOptions): this(connectionString)
{
this.unitOfWork.LoadOptions = loadOptions;
}
public virtual void SubmitChanges() {
this.unitOfWork.SubmitChanges();
}
public virtual List<T> Get(Expression<Func<T,bool>> query)
{
return this.unitOfWork.GetTable<T>().Where(query);
}
public virtual void Delete(Expression<Funct<T, bool>> query)
{
this.unitOfWork.GetTable<T>().DeleteAllOnSubmit(this.unitOfWork.GetTable<T>().Where(query));
}
public virtual T GetByID<T>(Expression<Funct<T, bool>> query)
{
return this.unitOfWork.GetTable<T>().Where(query).SingleOrDefault();
}
public virtual object Add(T entity, string IDPropertyName)
{
this.unitOfWork.GetTable<T>().InsertOnSubmit(entity);
this.SubmitChanges();
var ID = (string.IsNullOrEmpty(IDPropertyName)) ? null :
entity.GetType().GetProperty(IDPropertyName).GetValue(entity, null);
return ID;
}
public virtual void SubmitChanges()
{
this.unitOfWork.SubmitChanges();
}
public void Dispose()
{
this.unitOfWork.Dispose();
}
}
So jetzt habe ich dies mit jedem Entity verwenden können und Datacontext, die Einheit gehört. Meine Frage ist - würde ein TransactionScope innerhalb dieses kleinen Repository-Vorteils weitergeben oder instanziieren? Bisher habe ich nur einen DataContext, kann aber mehrere vorwärts haben, was kann mit dem aktuellen Design getan werden, um Transaktionen über mehrere Datenkontexte hinweg sicherzustellen?
Ist dies ein guter Ansatz, um den Kontext mit Generika zu verpacken und die Kunden davon zu befreien?
Toller Kommentar, könnten Sie einen Pseudo-Code zum Starten der Abstraktion der spezifischen Implementierung des DataContext bereitstellen, damit er später in eine andere Implementierung geändert werden kann? – dexter