Я абстрагирую свой DbContext, пытаясь рассмотреть отдельные проблемы и сделать мой код пригодным для модульного тестирования. Для этого я придумал следующий интерфейс.
Этот интерфейс ниже размещен в сборке с именем AllInterfaces. Этот проект имеет ссылку на EF dll из-за IDbSet в объявлении ниже.
public interface ISalesContext : IDisposable
{
IDbSet<Customer> Customers { get; }
IDbSet<Order> Orders { get; }
IDbSet<Product> Products { get; }
}
Я также создал поддельный набор баз данных следующим образом.
public class FakeDataSet<T> : IDbSet<T> where T: class, new()
{
.......
}
Итак, для моего объекта Customer этот поддельный набор данных выглядит следующим образом.
public class FakeCustomerDbSet : FakeDbSet<Customer>
{
..............
}
Затем я создал свой поддельный контекст следующим образом.
public class FakeSalesContext : ISalesContext
{
public FakeSalesContext ()
{
Customers = new FakeCustomerDbSet ();
}
public IDbSet<Customer> Customers { get; set; }
public IDbSet<Order> Orders{ get; private set; }
public IDbSet<Product> Products { get; private set; }
public void Dispose()
{
}
}
Все вышеперечисленные классы (FakeDataSet, FakeCustomerDbSet и FakeSalesContext), относящиеся к поддельным объектам, находятся в сборке AllFakes. Мне пришлось добавить ссылку на EF dll, поскольку интерфейс IDbSet также упоминается в этих поддельных классах.
Затем у меня есть проект модульного тестирования, в котором я использую поддельные объекты для выполнения модульного тестирования.
ISalesContext Context = new FakeSalesContext ();
Context.Customers.Add(new Customer() { Id = 1, LastName = "Karen" } );
Проблема в том, что этот модульный тест требует, чтобы я добавил ссылку на dll Entity framework. Если я удаляю ссылку на EF, я получаю следующую ошибку компиляции.
Тип «System.Data.Entity.IDbSet`1» определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку «EntityFramework, версия = 4.4.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089».
Если я удаляю ссылку на EF dll из сборки AllFakes, я получаю следующую ошибку.
Не удалось найти тип или имя пространства имен «IDbSet» (вам не хватает директивы using или ссылки на сборку?)
Есть ли смысл во все эти сборки добавлять ссылку на EF dll? Для меня, поскольку я абстрагировал свой контекст БД, он здесь не нужен. Любые предложения о том, как это сделать?