Emballage DbSet & lt; TEntity & gt; avec un DbSet / IDbSet personnalisé?

Tout d'abord, je pense que c'est un peu ridicule de le faire mais les autres membres de mon équipe insister sur elle et je ne peux pas venir avec un bon argument contre elle d'autre que "je pense que c'est stupide"...

Ce que nous essayons de faire est de créer un complètement abstraite de la couche de données et ensuite les différentes implémentations de cette couche de données. Assez Simple, non? Entrez Entity Framework 4.1...

Au final, notre objectif, ici, est que les programmeurs (je fais de mon mieux pour ne rester que sur la couche de données) ne veux plus jamais être exposés à des classes concrètes. Ils ne veulent jamais avoir à utiliser des interfaces dans leur code, à part évidemment avoir besoin d'instancier l'usine.

Je veux arriver à quelque chose comme ce qui suit:

D'abord, nous avons notre "Commune" de la bibliothèque de toutes les interfaces, nous allons l'appeler "Commun.De données":

public interface IEntity
{
    int ID { get; set; }
}

public interface IUser : IEntity
{
    int AccountID { get; set; }
    string Username { get; set; }
    string EmailAddress { get; set; }
    IAccount Account { get; set; }
}

public interface IAccount : IEntity
{
    string FirstName { get; set; }
    string LastName { get; set; }
    DbSet<IUser> Users { get; set; } //OR IDbSet<IUser> OR [IDbSet implementation]?
}

public interface IEntityFactory
{
    DbSet<IUser> Users { get; }
    DbSet<IAccount> Accounts { get; }
}

Depuis que nous avons ensuite une mise en œuvre de la bibliothèque, nous allons l'appeler "quelque Chose.Les données.Imp":

internal class User : IUser
{
    public int ID { get; set; }
    public string Username { get; set; }
    public string EmailAddress { get; set; }
    public IAccount Account { get; set; }

    public class Configuration : EntityTypeConfiguration<User>
    {
        public Configuration() : base()
        {
             ...
        }
    }
}

internal class Account : IAccount
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DbSet<IUser> Users { get; set; } //OR IDbSet<IUser> OR [IDbSet implementation]?

    public class Configuration : EntityTypeConfiguration<Account>
    {
        public Configuration() : base()
        {
             ...
        }
    }
}

Usine:

public class ImplEntityFactory : IEntityFactory
{
    private ImplEntityFactory(string connectionString) 
    {
        this.dataContext = new MyEfDbContext(connectionString);
    }
    private MyEfDbContext dataContext;

    public static ImplEntityFactory Instance(string connectionString)
    {
        if(ImplEntityFactory._instance == null)
            ImplEntityFactory._instance = new ImplEntityFactory(connectionString);

        return ImplEntityFactory._instance;
    }
    private static ImplEntityFactory _instance;

    public DbSet<IUser> Users //OR IDbSet<IUser> OR [IDbSet implementation]?
    { 
        get { return dataContext.Users; }
    }

    public DbSet<IAccount> Accounts //OR IDbSet<IUser> OR [IDbSet implementation]?
    {
        get { return dataContext.Accounts; }
    }
}

Contexte:

public class MyEfDataContext : DbContext
{
    public MyEfDataContext(string connectionString)
        : base(connectionString)
    {
        Database.SetInitializer<MyEfDataContext>(null);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new User.Configuration());
        modelBuilder.Configurations.Add(new Account.Configuration());
        base.OnModelCreating(modelBuilder);
    }

    public DbSet<User> Users { get; set; }
    public DbSet<Account> Accounts { get; set; }
}

Puis le front-end programmeurs serait de l'utiliser comme:

public class UsingIt
{
    public static void Main(string[] args)
    {
        IEntityFactory factory = new ImplEntityFactory("SQLConnectionString");
        IUser user = factory.Users.Find(5);
        IAccount usersAccount = user.Account;

        IAccount account = factory.Accounts.Find(3);
        Console.Write(account.Users.Count());
    }
}

Donc c'est assez bien... j'espère que quelqu'un ici peut-être pouvoir me pointer dans la bonne direction ou aider à m'en sortir avec un bon argument que je peux le feu à l'équipe de développement. J'ai regardé quelques autres articles sur ce site concernant l'EF ne pas être en mesure de travailler avec des interfaces et une réponse dire que vous ne pouvez pas mettre en œuvre IDbSet (que je trouve un peu curieux, pourquoi auraient-ils fournir si vous ne pouvais pas la mettre en œuvre?) mais jusqu'à présent sans succès.

Merci d'avance pour toute aide!
J

source d'informationauteur Jason