Упаковка DBSet <Щелтение> С пользовательским dbset / idbset?

Во-первых, я думаю, что это несколько смешно, но другие члены моей команды настаивают на этом, и я не могу прийти с хорошим спортом против него, кроме «я думаю, что он тупой» ...

Что мы пытаемся сделать, это создать совершенно абстрактный слой данных, а затем иметь различные реализации этого слоя данных. Достаточно просто, верно? Введите структуру Entity 4.1 ...

Наша конечная цель Вот что программисты (я делаю все возможное, чтобы остаться только на слое данных), никогда не хочу, чтобы быть подвержены воздействию конкретных классов. Они только когда-либо хотят использовать интерфейсы в их коде, помимо очевидно, нуждаетесь в создании фабрики.

Я хочу достичь чего-то вроде следующего:

Сначала у нас есть наша «обычная» библиотека всех интерфейсов, мы назовем ее «Common.data»:

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 Users { get; set; } // OR IDbSet OR [IDbSet implementation]?
}

public interface IEntityFactory
{
    DbSet Users { get; }
    DbSet Accounts { get; }
}

от того, что у нас есть реализация Библиотека, мы назовем это «что-нибудь .Data.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
    {
        public Configuration() : base()
        {
             ...
        }
    }
}

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

    public class Configuration : EntityTypeConfiguration
    {
        public Configuration() : base()
        {
             ...
        }
    }
}

Фабрика:

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 Users // OR IDbSet OR [IDbSet implementation]?
    { 
        get { return dataContext.Users; }
    }

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

Контекст:

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

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

    public DbSet Users { get; set; }
    public DbSet Accounts { get; set; }
}

, то интерфейсные программисты будут использовать его, такие как:

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());
    }
}

, так что это в значительной степени. .. Я надеюсь, что кто-то здесь может иметь возможность либо указывать мне в правильном направлении, либо помочь мне с хорошим аргументом, что я могу снова стрелять в команду разработки. Я посмотрел на некоторые другие статьи на этом сайте о EF, не имеющих возможности работать с интерфейсами и одним ответом , говоря, что вы не можете реализовать IDBSET (который я нахожу своего рода любопытно Почему они предоставили это, если вы не сможете его реализовать?) Но до сих пор безрезультатно.

заранее спасибо за любую помощь! J

17
задан Community 23 May 2017 в 12:26
поделиться