Entity Framework CTP5 и Ninject как мой IOC - PullRequest
3 голосов
/ 30 декабря 2010

Возможно ли в Entity Framework CTP5 создавать извлеченные сохраненные сущности через контейнер IOC?

Я использую Ninject, и он хорошо связан с MVC, но мне нужно внедрить некоторые сервисы в мои доменные объекты, когда они созданы для некоторых бизнес-правил.

Я бы предпочел сделать это с помощью конструктора, а не метода или свойства.

Ответы [ 3 ]

1 голос
/ 19 января 2011

Я склонен делать обратное тому, что вы пытаетесь сделать.Я делаю свои доменные объекты настолько невежественными, насколько это возможно (они, по сути, являются пакетами свойств).Когда вам нужно выполнить какое-то действие, например отправить электронное письмо, я бы использовал для этого сервис и получил бы метод, принимающий объект домена, для которого нужно выполнить действие.В этом случае вам просто нужно внедрить службы в различные части вашего приложения (что гораздо проще сделать с помощью Ninject).

1 голос
/ 19 января 2011

Я не уверен, чего именно вы здесь пытаетесь достичь, но EF почти не имеет точек расширяемости.Лучшее, что вы можете сделать, это подключиться к событию ObjectMaterialized, инициируемому ObjectContext.В CTP5 вам нужно привести ваш DbContext примерно так в конструкторе для DbContext:

((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
    this.ObjectContext_OnObjectMaterialized;

, а затем реализовать свою функцию ObjectContext_OnObjectMaterialized(object sender, ObjectMaterializedEventArgs e).Вы сможете получить доступ к своему объекту, который, к сожалению, уже был реализован.В зависимости от ваших потребностей, вы можете использовать здесь интересное поведение.

Кстати, это предложение не имеет смысла для меня:

Мне нужно добавить несколько репозиториев в мойдоменные объекты, когда они созданы для некоторых бизнес-правил.

Разве это не идет вразрез с доменными объектами невосприимчивости к постоянству?

0 голосов
/ 06 февраля 2011

Я думаю, что код EF сначала CTP 5 может помочь. Он учитывает интерфейс IValidatableObject, который принимает объект ValidationContext в качестве аргумента. ValidationContext является ServiceLocator, поэтому вы должны иметь возможность получить экземпляр контейнера IoC, используя объект validationContext. (Это только моя первоначальная мысль, хотя я ничего не пробовал). Извините, если мой английский не очень понятен.

Обновление Извините, сразу после того, как я разместил этот комментарий, я понял, что вопрос совершенно отличается от того, что я понял. Итак, я попробовал несколько вещей сам, и после некоторого удара и испытания и намного большего количества поиска в Google, я смог где-то добраться. Я планировал опубликовать ответ здесь, но затем подумал против, так как ответ будет очень длинным. Итак, вместо этого я опубликовал этот блог.

http://nripendra -newa.blogspot.com / 2011/02 / субъект-каркасного CTP5 инъекционного-with.html

Может быть, это поможет некоторым гуглерам искать то же самое. Надеюсь, я правильно понял вопрос в этот раз.

...