BIG EDIT: эта проблема, вероятно, вызвана MEF!Проблемы с объектами самообучения Entity Framework и ASP MVC .NET и управляемая расширяемость Framework
Я использую сервис-ориентированную архитектуру и все мои контроллеры MVC выполняют действия через службы.
У меня есть базовый сервис, который выглядит следующим образом:
public abstract class BaseService
{
protected MyObjectModel context;
public BaseService()
{
context = new MyObjectModel();
}
}
Я тогда услуги, которые наследуют
[Export(typeof(IEmployeeService))]
public class EmployeeService : BaseService, IEmployeeService
{
public void NewEmployee(Employee newEmployee)
{
context.Employees.AddObject(newEmployee);
context.SaveChanges();
}
}
у меня есть контроллеры также Наследование от базового класса, который обеспечивает доступ ко всем требуемые услуги, чтобы они могли позвонить:
EmployeeService.AddEmployee(new Employee() { Name = "JohnDoe"});
Все это работало wo когда я начал видеть, что ObjectContext не точно отражает базу данных при построении.
Я установил точку останова в конструкторе BaseService и с помощью профилировщика Sql Server увидел, что новый MyObjectModel даже не попал в БД, но вытащил данные из некоторого кеша предположительно?
Я наткнулся на свойство MergeOption коллекций в контексте и изменил это, чтобы данные были свежими, но теперь мне нужно использовать это каждый раз, когда я создаю новый метод службы, который возвращает сущности!
EDIT: Я спотыкался, пока не понял, что мои проблемы, вероятно, вызваны MEF.
Я переопределил контроллер ControllerFactory и реализовал тот, который использует MEF для создания экземпляров служб. Вероятно, я вижу, что MEF поддерживает живые объекты между вызовами.
Так
1) Где я могу узнать больше об этом поведении? И что я могу сделать, чтобы остановить его и создать новую композицию при каждом вызове объекта?
Спасибо.
Возможно, лучше создать отдельный CompositionContainer для каждого запроса. Тогда вам не придется беспокоиться о том, что MEF держится за ссылки (что будет, если части реализуют IDisposable). Вы можете создать каталог один раз, а затем создать CompositionContainer, используя этот каталог для каждого запроса. –
Каковы затраты, связанные с созданием CompositionContainer в каждом запросе? Они достаточно малы, чтобы игнорировать? Похоже, это правильный путь ... –
И на какой стадии я должен создавать этот контейнер, на фабрике контроллера? Я хочу создать единый ObjectContext для каждого запроса и поделиться им среди моих сервисов. Является ли контроллер фабрикой местом для этого? –