說我有一個基類,稱爲BaseService,然後我有另一個名爲AuditService的類,它從BaseService繼承,也許我有另一個名爲FooService,也從BaseService繼承的類。如何實現與多個子對象的繼承.net
所以層次結構看起來像這樣
BaseService
|
---- AuditService
|
---- FooService
現在,如果我需要一個包含AuditService和FooService接口的所有功能,一個新的服務?
c#不允許你從多個對象繼承,所以我會怎麼做呢?
我不想從1個服務繼承,並重新編碼所有其餘的項目。
編輯:
要包括有關我的班一些細節,下面的一些代碼。
正如你所看到的,我重寫了基本服務在foo服務和可審計服務中的特定功能。在將來,我將需要一個服務,實現baseservice,foo服務和可審計服務的所有功能。
BASESERVICE
public abstract class BaseService<TEntity>
where TEntity : class, IBaseEntity
{
protected DataContext _context;
protected BaseService(DataContext context)
{
_context = context;
}
public virtual async Task<ICollection<TEntity>> GetAllAsync()
{
return await _context.Set<TEntity>().ToListAsync();
}
public virtual Task<TEntity> GetAsync(long id)
{
return _context.Set<TEntity>().FindAsync(id);
}
public virtual Task<int> AddAsync(TEntity t)
{
if (_context.Entry(t).State == EntityState.Detached)
{
_context.Set<TEntity>().Add(t);
}
_context.Entry(t).State = EntityState.Added;
return _context.SaveChangesAsync();
}
public virtual Task<int> AddAllAsync(ICollection<TEntity> all)
{
foreach (var item in all)
{
if (_context.Entry(item).State == EntityState.Detached)
{
_context.Set<TEntity>().Add(item);
}
_context.Entry(item).State = EntityState.Added;
}
return _context.SaveChangesAsync();
}
public virtual Task<int> UpdateAsync(TEntity updated)
{
_context.Entry(updated).State = EntityState.Modified;
return _context.SaveChangesAsync();
}
public virtual async Task<int> DeleteAsync(long key)
{
TEntity entity = await GetAsync(key);
_context.Entry(entity).State = EntityState.Deleted;
return await _context.SaveChangesAsync();
}
public virtual Task<int> DeleteAsync(TEntity t)
{
_context.Entry(t).State = EntityState.Deleted;
return _context.SaveChangesAsync();
}
}
AUDITABLESERVICE
public class AuditableService<TEntity> : BaseService<TEntity>
where TEntity : class, IAuditableEntity
{
public virtual override Task<int> DeleteAsync(long key)
{
return DeleteAsync(key, true);
}
public virtual async Task<int> DeleteAsync(long key, bool useFlag)
{
TEntity entity = await GetAsync(key);
return await DeleteAsync(entity, useFlag);
}
public virtual override Task<int> DeleteAsync(TEntity t)
{
return DeleteAsync(t, true);
}
public virtual Task<int> DeleteAsync(TEntity t, bool useFlag)
{
if (useFlag)
{
// flag item as deleted
t.IsDeleted = true;
return UpdateAsync(t);
}
else
{
return base.DeleteAsync(t);
}
}
}
FooService接口
public class FooService<TEntity> : BaseService<TEntity>
where TEntity : class, IBaseEntity
{
protected IValidator<TEntity> _validator;
protected ValidatorService(DataContext context)
: base(context)
{
}
public override async Task<int> AddAsync(TEntity t)
{
var results = await _validator.ValidateAsync(t);
if (results.IsValid)
{
return await base.AddAsync(t);
}
else
{
throw new ValidationException(results.Errors);
}
}
public override async Task<int> UpdateAsync(TEntity updated)
{
var results = await _validator.ValidateAsync(updated);
if (results.IsValid)
{
return await base.UpdateAsync(updated);
}
else
{
throw new ValidationException(results.Errors);
}
}
}
我已經添加了一些代碼來向您展示類是如何繼承 – Gillardo 2014-12-03 11:06:28
(好名字),這是有道理的。謝謝。另一個問題,如果你不介意的話,稍微偏離主題。單元測試這個新服務,我猜測我只需要在NewService中測試「新」功能,單元測試會分別測試BaseService功能。我wouldnt必須重新測試每個基本服務功能從newservice我會嗎? – Gillardo 2014-12-03 12:06:43
如果我有多個NewServices應該同時使用validatorService和fooService,會發生這種變化嗎?或者,我應該簡單地創建一個使用上述模式的新ValidateFooService,並且每個需要這兩個服務的新服務都只是繼承它?因爲我不想重新編碼每個AddAsync在我創建的每個新服務中調用fooService(可能是其中的25個) – Gillardo 2014-12-03 13:32:20