Отслеживание сущностей в нескольких контекстах - PullRequest
0 голосов
/ 14 сентября 2011

в типичном приложении MVC3 с моделью EF каждый контроллер создает свою собственную копию контейнера модели.это означает, что если бы я должен был создать класс в другом файле и ему требовался доступ к модели, ему нужно было бы создать собственный контейнер.

Примите во внимание следующее:

namespace X.Web.Controllers
{
    public class TestController : Controller
    {
        EFContainer db = new EFContainer();

        public ActionResult Whatever()
        {
            User u = db.Users.Find(3);
            ...
        }

если бы я хотел абстрагировать мою выборку пользователя в классе Auth, то ему пришлось бы создавать свои собственные db, поскольку у него нет доступа к контроллеру - все нормально, пока контроллер не захочет внести изменения ввозвращаемый объект:

    public ActionResult Whatever()
    {
        User u = Auth.GetUser();
        u.Name = "ekkis";
        db.SaveChanges();
        ...
    }

, так как пользователь в этой точке принадлежит к другому контексту ... так что либо я должен поделиться своим db с Auth, либо, возможно, мне придется сделать дебильныйдвойной поиск:

    public ActionResult Whatever()
    {
        int id = Auth.GetUserId();
        User u = db.Users.Find(id);
        u.Name = "ekkis";
        db.SaveChanges();
        ...
    }

Каков рекомендуемый способ борьбы с этим?

1 Ответ

1 голос
/ 14 сентября 2011

Почему бы вам не передать контекст модели / EF с помощью инжектора конструктора в ваш класс Auth?Это кажется наиболее разумным способом (то же самое относится и к вашему контроллеру на самом деле, когда у вас настроен контейнер IOC).

public class Auth
{
    public Auth(EFContainer db) 
    {
        //...
    }
}

В идеале вы бы также сделали эту работу на основе абстрактного интерфейса, чтобы вы могли протестироватьAuth независимо от EF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...