2016-09-06 5 views
2

Я реализовал шаблон EntityFramework вместе с репозиторием и модулем работы. Реализация похожа на Code Project Repository Example, однако мне требуется усовершенствование для Unit of Work.Общий блок работы

Единица работы

public class GenericUnitOfWork : IDisposable 
{ 
    // Initialization code 

    public Dictionary<Type, object> repositories = new Dictionary<Type, object>(); 

    public IRepository<T> Repository<T>() where T : class 
    { 
     if (repositories.Keys.Contains(typeof(T)) == true) 
     { 
      return repositories[typeof(T)] as IRepository<T> 
     } 
     IRepository<T> repo = new Repository<T>(entities); 
     repositories.Add(typeof(T), repo); 
     return repo; 
    } 

    // other methods 
} 

выше UOW тихо обобщенная и он нацелен на родителю Repository класса всегда. У меня есть другой объект, например студент, у которого есть собственный репозиторий, расширяющий класс репозитория. У конкретного студенческого репозитория есть метод «GetStudentMarks()». Теперь я не могу использовать общий класс Unit Of Work, поскольку он всегда указывает на родительский репозиторий.

Как реализовать общую единицу работы для обработки таких ситуаций? Заранее спасибо.

ответ

1

Вы можете сделать класс GenericUnitOfWork дженерики, указав объект и тип хранилища:

public class GenericUnitOfWork<TRepo, TEntity> : IDisposable 
    where TRepo : Repository<TEntity> 
{ 
    // Initialization code 

    public Dictionary<Type, TRepo> repositories = new Dictionary<Type, TRepo>(); 

    public TRepo Repository() 
    { 
     if (repositories.Keys.Contains(typeof(TEntity)) == true) 
     { 
      return repositories[typeof(TEntity)]; 
     } 
     TRepo repo = (TRepo)Activator.CreateInstance(
      typeof(TRepo), 
      new object[] { /*put there parameters to pass*/ }); 
     repositories.Add(typeof(TEntity), repo); 
     return repo; 
    } 

    // other methods 
} 

Нечто подобное должно работает.

0

Я полагаю, что вы хотите выполнить некоторые операции над StudentMarks в методе GetStudentMarks. В противном случае, если ваши модели правильно сопоставлены, вы можете просто загрузить их, используя один из методов загрузки данных отношения. В противном случае, если общая Repository устраивает большинство ваших сущностей, но вам нужна некоторые дополнительные методы для небольшого числа ваших сущностей, то я рекомендую создать методы расширения для этих хранилищ:

public static class StudentReposityExtensions 
{ 
    public List<Mark> GetStudentMarks(
     this IRepository<Student> studentRepostitory) 
    { 
     ..... 
    } 
} 
+0

Проблема заключается в том, что е Разработчики склонны создавать классы по своему желанию. Поэтому я хотел остановить это, поэтому мне потребовался более общий UoW. –

1

Generic UnitOfWork !!! вы реализация неверной единицы работы

Смотрите этот код:

using System.Data.Entity; 
using System; 


namespace EF_Sample07.DataLayer.Context 
{ 
public interface IUnitOfWork 
{ 
    IDbSet<TEntity> Set<TEntity>() where TEntity : class; 
    int SaveChanges(); 
    } 
} 

Зачем использовать UnitOfWork?

Потому что:

  • Повышение производительности
  • параллелизм вопросы
  • Правильное использование сделок

См Пример:

Категория

public class Category 
{ 
    public int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Title { get; set; } 


    public virtual ICollection<Product> Products { get; set; } 
} 

Продукт

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 


    [ForeignKey("CategoryId")] 
    public virtual Category Category { get; set; } 
    public int CategoryId { get; set; } 
} 

UnitOfWork

public interface IUnitOfWork 
{ 
    IDbSet<TEntity> Set<TEntity>() where TEntity : class; 
    int SaveChanges(); 
} 

DbContext

public class Sample07Context : DbContext, IUnitOfWork 
{ 
    public DbSet<Category> Categories { set; get; } 
    public DbSet<Product> Products { set; get; } 


    #region IUnitOfWork Members 
    public new IDbSet<TEntity> Set<TEntity>() where TEntity : class 
    { 
     return base.Set<TEntity>(); 
    } 
    public int SaveAllChanges() 
    { 
     return base.SaveChanges(); 
    } 
    #endregion 
}