BaseService라는 기본 클래스가 있다고 가정 해 봅시다. 그러면 BaseService에서 상속되는 AuditService라는 또 다른 클래스가 있으며 BaseService로부터 상속받은 FooService라는 또 다른 클래스가있을 수 있습니다.여러 하위 개체로 상속을 구현하는 방법 .net
그래서 계층 지금이
BaseService
|
---- AuditService
|
---- FooService
어떻게 생겼는지 내가 AuditService 및 FooService의 모든 기능을 포함하는 새로운 서비스를 필요로하는 경우?
# 여러 개체에서 상속을 허용하지 않으므로 어떻게해야합니까?
1 개의 서비스에서 상속하고 나머지 모든 항목을 다시 코딩하고 싶지는 않습니다.
편집 :
내 클래스에 대한 자세한 몇 가지 세부 사항 아래의 일부 코드를 포함합니다.
위에서 볼 수 있듯이 기본 서비스의 특정 기능을 foo 서비스 및 감사 대상 서비스에서 대체합니다. 앞으로는 baseervice, 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 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
(좋은 이름)을 상속하는 방법을 보여주기 위해 몇 가지 코드를 추가했습니다. 이는 의미가 있습니다. 고맙습니다. 또 다른 질문입니다. 주제를 약간 벗어났습니다. 이 newService를 테스트하는 유닛은 NewService에서 "new"함수 만 테스트하면됩니다. 단위 테스트는 BaseService 기능을 별도로 테스트 할 것입니까? 나는 newservice에서 각 baseservice 함수를 다시 테스트해야하지 않겠습니까? – Gillardo
validatorService와 fooService를 모두 사용해야하는 NewServices가 여러 개있는 경우 이렇게 변경됩니까? 아니면 단순히 위의 패턴과 두 서비스를 필요로하는 각각의 새로운 서비스를 사용하는 새로운 ValidateFooService를 생성해야합니까? 나는 각각의 AddAsync를 호출하여 각 새로운 서비스에서 fooService를 호출하고 싶지 않으므로 (그들 중 25 개가 될 수있다) – Gillardo