Domanda

Mi dispiace se il titolo non è abbastanza illuminante dopo un po 'non riuscivo a venire con una frase per spiegare il mio problema.

è come questo: Sto usando EF6, il primo approccio del database. Tutte le mie entità hanno un ID e una proprietà abilitata. Ho il file EDMX sul mio DAL e ora ho bisogno di progettare il livello aziendale (BLL per me).

Dal momento che dovrò convalidare quali dati provengono dal DAL ed è visibile al resto dell'app ho deciso di creare un'interfaccia per gli operatori comuni, creare una classe base che implementa e ha tutte le mie tabelle di database personalizzate \ I fornitori di entità ereditano.

Se questo non ha senso, ecco cosa sto facendo: (tutto questo è in BLL)

public interface IEntityManager<T> where T : class {
        void Add(T e, bool commit=false);
        void Delete(T e);
        void DeleteByID(int id);
        void Update(T e);
        IQueryable<T> Search(Expression<Func<T, bool>> predicate);
        IQueryable<T> GetAll();
        T Get(int id);
    }
.

Ora, la classe base che implementa le operazioni comuni è questa: (Modificata per leggibilità e brevità)

 public class EntityManager<TEntity> : IDisposable, IEntityManager<TEntity> where TEntity : class {
        private readonly DbContext _ctx;
        private readonly DbSet<TEntity> _set;

        public EntityManager() {
            _ctx = new DomainModelFactory();
            _set = _ctx.Set<TEntity>();
        }

        public void Add(TEntity e) {
            _set.AddOrUpdate(e);
        }            

//other methods here

        public TEntity Get(int id) {
            return _set.Find(id);
        }


    }
.

Per creare manager che accederanno effettivamente ai dati e renderlo utilizzabile attraverso l'applicazione, sto pianificando di fare qualcosa come:

public class VenueManager: EntityManager<Venue> {
        public VenueManager():base()  {
        }
    }
.

per la classe che gestirà la mia vita dell'entità. Sto creando lezioni invece di usare qualcosa come

var venueManager = new EntityManager<Venue>();
.

Perché queste classi avranno alcuni metodi specializzati. Spero che tu potessi capire cosa ho fatto finora (e funziona)

Ora, il mio problema è che ogni entità ha due campi comuni: ID (INT) e abilitato (BOOL) Io sono per usarli quando si eliminano con ID e quando la codifica diventa e getall perché devo solo Ottieni oggetti che hanno abilitato= true. Ora so che dal momento che creerò lezioni di manager, potrei solo usare C & P il codice, ma mi stavo chiedendo, c'è un modo in cui posso codificare questa nella classe di EntityManager e avere tutti i manager ereditare il metodo ma usando il calcestruzzo Classi?

Qualcosa del genere: In EntityManager Class:

 public TEntity Get(int id) {
            return _set.Where(T.ID==id);
        }
.

questo è fondamentalmente quello che voglio: un modo per utilizzare queste proprietà alla classe base (EntityManager) in cui importa (metodi DeletebyID, ottenere e getall) in un modo che tutte le classi di gestore (Gestorevvenue nell'esempio) ereditano questi metodi così che non dovrò scriverli dappertutto? (ha circa 100 entità)

È stato utile?

Soluzione

Dovresti definire una classe base o un'interfaccia per tutte le tue entità, qualcosa del genere come:

public class Entity {
    public int Id { get; set; }
    public bool Enabled { get; set; }
}
.

E nella tua classe EntityManager aggiungere un vincolo generico a tentatività come where TEntity : Entity

Allora sarai in grado di utilizzare le proprietà comuni Id e Enabled all'interno della classe base EntityManager.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top