2017-02-15 25 views
0

Я пытаюсь выяснить способ абстрагирования логики адаптера. Я хочу иметь класс Generic Abstract, который наследует элемент, переданный в него.Generic Abstract class, который наследует участников от параметра Passed Type

public interface IAdaptable<in TIEntity, in TIDTO, TDTO> 
    where TDTO : TIDTO 
{ 
    void Initialize(TIEntity entity); 
    TDTO ToDTO(); 
} 

public interface IAdaptable<in TIEntity, TDTO> : IAdaptable<TIEntity, TDTO, TDTO> 
{ 
} 

public abstract class AdapterBase<TEntity, TIDTO, TDTO> : IAdaptable<TEntity, TIDTO, TDTO>, TIDTO 
    where TDTO : TIDTO 
{ 
    protected TEntity entity; 

    public void Initialize(TEntity entity) 
    { 
     this.entity = entity; 
    } 

    public TDTO ToDTO() 
    { 
     return Mapper.Map<TIDTO, TDTO>(this); 
    } 
} 

Этот код не работает, потому что вы не можете наследовать от общего параметра Я прошел в, даже если идентификатор, как мой родительский класс для обеспечения его.

Incase Любой интересуется, почему или что здесь происходит, эта база адаптера применяется к адаптеру, который должен реализовать свойства интерфейса DTO, затем для геттеров и настроек применяется дополнительная логика, чтобы предотвратить подделку идентификатора и сделать некоторая базовая логика установки.

Этот код отлично работает, если я применяю его вручную для каждого адаптера, но id предпочитает базу адаптера или прокси-сервер для базы адаптера, которая будет обрабатывать всю эту логику для меня.

Кто-нибудь знает, как я могу абстрагироваться от этой логики или работать, поэтому мне не нужно вручную применять эту логику к каждому адаптеру?

+0

Я считаю, что динамические прокси-серверы замка - единственный способ достичь этого, но я могу ошибаться. – inquisitive

+0

@inquisitive спасибо за отзыв Я буду исследовать, что это такое –

+0

Вы уверены, что это опечатка: 'public abstract class AdapterBase : IAdaptable TIDTO' последний' TIDTO' – CodingYoshi

ответ

0

Для тех из вас, кто хочет получить ответ, я нашел решение, но вам может и не понравиться.

Это полный интерфейс:

public interface IAdaptable<in TIEntity, in TIDTO, TDTO> 
    where TDTO : TIDTO 
{ 
    bool IsInitialized { get; set; } 
    void Initialize(TIEntity entity); 
    TDTO ToDTO(TIDTO iEntityDTO); 
    void ApplyFrom(TIDTO entityDTO); 
} 

Что теперь вы можете создать адаптер базу, как это:

public class AdapterBase<TIEntity, TIDTO, TDTO> : IAdaptable<TIEntity, TIDTO, TDTO> 
    where TDTO : TIDTO 
{ 
    #region Consts 

    public const string FAILED_TO_INITIALIZE_ADAPTER_ERROR = "Failed to Initialize Adapter make sure you called the Initialize function"; 

    #endregion 

    #region Protected Members 

    protected TIEntity _entity; 

    #endregion 

    #region IAdaptable 

    public bool IsInitialized { get; set; } 

    public void Initialize(TIEntity entity) 
    { 
     this._entity = entity; 
     IsInitialized = true; 
    } 

    public void ApplyFrom(TIDTO entityDTO) 
    { 
     if (false == IsInitialized) 
     { 
      throw new Exception(FAILED_TO_INITIALIZE_ADAPTER_ERROR); 
     } 

     Mapper.Map(entityDTO, this); 

    } 

    public TDTO ToDTO(TIDTO adaptable) 
    { 
     if (false == IsInitialized) 
     { 
      throw new Exception(FAILED_TO_INITIALIZE_ADAPTER_ERROR); 
     } 

     return Mapper.Map<TIDTO, TDTO>(adaptable); 
    } 

    #endregion 
} 

Теперь вы можете использовать адаптер в родовой службе сырой, как, как так

public class AsyncCRUDService<TEntity, TIDTO, TDTO, TAdapter> : IAsyncCRUDService<TDTO> 
    where TDTO : TIDTO 
    where TEntity : class, new() 
    where TAdapter : class, TIDTO, IAdaptable<TEntity, TIDTO, TDTO> 
{ 
    protected DbContext _context; 
    protected TAdapter _adapter; 

    public AsyncCRUDService(DbContext context, TAdapter adapter) 
    { 
     this._context = context; 
     this._adapter = adapter; 
    } 

    public async virtual Task<TDTO> Get(object[] id) 
    { 
     var entity = await this._context.Set<TEntity>().FindAsync(id); 

     if (null == entity) 
     { 
      throw new InvalidIdException(); 
     } 
     return this.AdaptToDTO(entity); 
    } 

    protected virtual TDTO AdaptToDTO(TEntity entity) 
    { 
     this._adapter.Initialize(entity); 
     return this._adapter.ToDTO(this._adapter); 
    } 

} 

Единственный недостаток в том, что теперь ваши услуги привязаны к жесткой зависимости