Перед сохранением объекта добавьте роль. Где эта логика? - PullRequest
0 голосов
/ 08 октября 2011

В моем приложении у меня есть этот код:

public class Couple
{
    public List<Role> Roles { get; set; };
    public Couple()
    {
        //How can I add the role in the constructor?
        //Is it correct to refer to the repository?
        //If so, this will impact on my EF Code First
    }
}

public class Role
{
    public string Name { get; set; };
}

public class DataContext : DbContext
{
    DbSet<Couple> Couples { get; set; }
    DbSet<Role> Roles { get; set; }
}

public interface IRepository
{
    void AddCouple(Couple couple);
}

public class Repository : IRepository
{
    DataContext db = new DataContext();

    public void AddCouple(Couple couple)
    {
        var role = (from r in db.Roles
                        where r.Name == "Couple"
                        select r).SingleOrDefault();

    couple.Roles.Add(role); //This is a correct place?
        db.Couples.Add(entity);

        db.SaveChanges();
    }
}

У меня также есть тестовый проект с поддельным репозиторием:

public class FakeRepository : IRepository
{
    List<Couple> Couples = new List<Couple>();
    ListRole> Roles = new List<Role>();

    public void AddCouple(Couple couple)
    {
        var role = (from r in Roles
                        where r.Name == "Couple"
                        select r).SingleOrDefault();

        couple.Roles.Add(role);
        Couples.Add(entity);
    }
}

В Repository класс в AddCoupleметод, я добавляю роль.Но я думаю, что это не в правильном месте.

Мой вопрос заключается в том, где разместить логику, посмотреть в хранилище role и заполнить список ролей couple.

И возможность продолжать строить тесты.

1 Ответ

0 голосов
/ 08 октября 2011

Следующая строка в вашем хранилище проблематична:

DataContext db = new DataContext();

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

Вы можете определить абстракцию:

public interface IMyDataContext
{
    DbSet<Couple> Couples { get; set; }
    DbSet<Role> Roles { get; set; }
    int SaveChanges();
}

, а затем предоставить некоторую реализацию:

public class DataContext : DbContext, IMyDataContext
{
    public DbSet<Couple> Couples { get; set; }
    public DbSet<Role> Roles { get; set; }
}

Теперь ваш репозиторий должен работать только с абстракцией:

public class Repository : IRepository
{
    private readonly IMyDataContext _db;
    public Repository(IMyDataContext db)
    {
        _db = db;
    }

    public void AddCouple(Couple couple)
    {
        var role = (from r in _db.Roles
                    where r.Name == "Couple"
                    select r).SingleOrDefault();

        couple.Roles.Add(role); 
        _db.Couples.Add(entity);
        _db.SaveChanges();
    }
}

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

...