考慮下面的代碼: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