在保存对象之前,添加一个角色。这个逻辑应该在哪里?

时间:2011-10-08 13:52:22

标签: asp.net-mvc-3 unit-testing architecture repository-pattern

在我的应用程序中,我有这段代码:

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 :(得分:0)

存储库中的以下行存在问题:

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

现在,在您的单元测试中,您可以使用模拟框架将虚假上下文提供给存储库,并能够单独测试它。