考虑下面的代码:C#抽象类一般属性
public abstract class RepositoryBase<T> where T : class
{
#region Members
private MyContext dataContext;
private readonly IDbSet<T> dbset;
#endregion
protected RepositoryBase(IDatabaseFactory databaseFactory)
{
DatabaseFactory = databaseFactory;
dbset = DataContext.Set<T>();
}
protected IDatabaseFactory DatabaseFactory
{
get; private set;
}
protected MyContext DataContext
{
get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
}
public virtual void Delete(T entity)
{
dbset.Remove(entity);
}
我想与下面的一个替换删除方法,因为我更喜欢简单的设置我的对象已删除字段设置为true,以指示它被删除,而不是真的删除它。
public virtual void Delete(T entity)
{
entity.Deleted = true;
dbset.Attach(entity);
dataContext.Entry(entity).State = EntityState.Modified;
}
我正在使用POCO实体,并且所有这些实体都存在Deleted属性。但是,在上面的代码中,实体的类型是T,而T“不知道”它所代表的所有对象中都有一个Deleted属性。解决这个问题的最优雅的方法是什么?顺便说一下,我想以类似的方式访问其他字段(DateCreated,CreatedBy,DateModified和ModifiedBy)。
更新:我想无论是接口和抽象类的解决方案,这似乎善于第一,但后来我在编译的时候得到了在这两种情况下出现以下错误信息:
错误11型“ MyProject.Domain.Person'不能用作泛型类型或方法'MyProject.Data.Infrastructure.RepositoryBase'中的类型参数'T'。没有从'MyProject.Domain.Person'到'MyProject.Domain.AbstractEntity'的隐式引用转换。
这里是错误消息,指的是代码:
namespace MyProject.Data
{
public class PersonRepository : RepositoryBase<Person>, IPersonRepository
{
public PersonRepository(IDatabaseFactory databaseFactory)
: base(databaseFactory)
{
}
}
public interface IPersonRepository : IRepository<Person>
{
}
}
更新2:
我终于得到它与SLaks提出的解决方案的工作。我使用的接口,而且我修改的模板而产生的所有POCO实体,使他们全部来自以下IEntity接口派生:
namespace MyProject.Domain
{
public interface IEntity
{
System.DateTime CreatedDate
{
get;
set;
}
string CreatedBy
{
get;
set;
}
System.DateTime ModifiedDate
{
get;
set;
}
string ModifiedBy
{
get;
set;
}
bool Deleted
{
get;
set;
}
}
}
使用抽象的实体类会比较复杂,因为那么所有的属性抽象类将不得不在实体类中重写。
你问'其中T:类,MyClass'? – Tigran 2012-01-09 22:33:17
@Tigran我尝试过,但是我收到了编译错误消息。看到我上面的更新。 – 2012-01-09 23:54:21
编译器错误意味着Person不从AbstractEntity继承。你忘了重新定义它的基类吗? – phoog 2012-01-10 00:06:16