Если у вас есть библиотека классов, которая использует классы из другой DLL, например EntityFramework.Dll
, то в вашем конечном продукте ваша DLL должна быть в состоянии найти эту другую DLL.
Самый простой способпозаботьтесь об этом, чтобы добавить эту другую DLL к вашим ссылкам.Это автоматически позаботится о том, чтобы после правильного развертывания (установки) была скопирована и другая DLL.
Однако, довольно часто вы не хотите, чтобы пользователи вашей DLL также обращались к другой DLL.К счастью, это не нужно , если вы позаботитесь о том, чтобы ни один из идентификаторов другой DLL не находился в одном из ваших открытых классов / интерфейсов
Так что если вашему классу требуется EntityFramework.DLL,и вы не хотите, чтобы пользователи вашего класса не обращались к EntityFramework.DLL, убедитесь, что ничего из идентификаторов Entity Framework не является общедоступным.
Лучший способ - использовать интерфейсы.Вы также можете попытаться сделать элементы, которые используют Entity Framework внутренними в вашем классе.
Поэтому вместо:
public class DbSchool : DbContext
{
...
}
выполните следующее:
public interface IDbSchool
{
IQueryable<Student> Students {get;}
IQueryable<Teacher> Teachers {get;}
IQueryable<ClassRoom> ClassRooms {get;}
IQueryable<Course> Courses {get;}
}
internal class DbSchool : DbContext, IDbSchool
{
internal DbSet<Student> Students {get; set;}
internal DbSet<Teachter> Teachers {get; set;}
...
// Explicit interface implementation of IDbSchool:
IQueryable<Student> IDbSchool.Students {get => this.Students;}
IQueryable<Teacher> IDbSchool.Teachers {get => this.Teachers;}
...
}
КакПока вы пишете код внутри своей DLL, вы можете использовать все из Entity Framework, в конце концов, ваша DLL ссылается на него.
Пользователи вашей DLL не обращаются к Entity Framework, поэтому они не могут использоватьидентификаторы, такие как DbContext
и DbSet
.Однако, если они ссылаются на вашу DLL, они могут использовать идентификаторы как Student
, Teacher
, Course
и, конечно, IDbSchool
.
Но как мой пользователь создает объект классаDbSchool?
Ответ: он не может.Таким образом, вам нужно создать фабричную функцию, которая возвращает IDbSchool:
public static class SchoolFactory
{
public static IDbSchool CreateSchoolContext(...)
{
return new DbSchool(...);
}
}
Использование:
using (IDbSchool dbSchool = SchoolFactory.CreateSchoolContext(...))
{
var teachersWithStudents = dbSchoolTeachers
.Select(teacher => new
{
Id = teacher.Id,
Name = teacher.Name,
Students = teacher.Students.Select(student => new
{
Id = student.Id,
Name = student.Name,
})
.ToList(),
})
.Where(teacher => teacher.Students.Any());
}
Примечание: потому что вы хотите правильно утилизировать DbSchool
, IDbSchool
должен быть получен из IDisposable
public interface IDbSchool, IDisposable {...}