Как интегрировать db4o и autofac для моих объектов Model? - PullRequest
0 голосов
/ 15 июня 2011

Я могу видеть, как я могу создавать экземпляры объектов классов с помощью autofac, а затем передавать их в db4o для хранения. Когда мне пора извлечь экземпляры объектов из db4o, как мне зарегистрировать объекты с помощью autofac?

Первоначально я планировал использовать инструмент MSBuild для db4o для реализации прозрачной активации / персистентности, но, похоже, мне, возможно, придется вручную реализовать интерфейс IActivatable для всех моих объектов Model, чтобы я мог добавить дополнительный код в IActivatable::Bind() зарегистрировать this указатели по мере их активации.

Что еще хуже, я предвижу, что реализация IActivatable::Bind() будет иметь доступ к Singleton текущей области действия Autofac для выполнения регистрации. Очевидно, я не могу передать текущую область действия экземпляру объекта, который активирует db4o. Как бы плохо ни обходить эту сферу, я могу себе представить стоны людей, которые думают о том, чтобы прикрепить сферу текущей жизни в публичном синглтоне.

Альтернативой может быть реализация обработчиков типов в db4o и перехват экземпляра объекта в этой точке, но это похоже на отмену любых преимуществ использования db4o для хранения объектов.

Или я просто сошел с ума от идеи использовать автофак для создания экземпляров всех объектов? (Например, у меня есть молоток, и все выглядело как гвоздь.) Должны ли объекты Model просто создаваться простым старым «новым» и какой-либо магией, которую использует db4o? Другими словами, используйте autofac только с моими объектами View, ViewModel и Controller.

Ответы [ 2 ]

3 голосов
/ 15 июня 2011

Там нет «истинного пути» :), но рекомендуемый подход здесь состоит в том, чтобы отказаться от использования служб непосредственно в модели домена и вместо этого отправлять «События домена» обработчикам с поддержкой IoC.

У Джимми Богарда есть много постов на эту тему - есть пример для StructureMap, который вы сможете адаптировать для Autofac: http://lostechies.com/jimmybogard/2010/08/04/container-friendly-domain-events/

(Кстати, у меня есть пример реализации на основе Autofac, который я собираюсь выпустить в ближайшие несколько недель.)

1 голос
/ 15 июня 2011

Я бы порекомендовал заменить каждое «новое» на экземпляр Autofac. Мое эмпирическое правило заключается в том, что, когда объект нуждается в сложных зависимостях (не простых коллекциях, базовых типах CLR, других простых объектах), тогда я позволяю Autofac выполнять работу. Простой предметный объект Я обычно просто использую оператор new или создаю фабрику.

Я не уверен на 100%, правильно ли я понял ваш вопрос. Вы хотите привязать некоторые сервисы к своим моделям доменов, когда они создаются? Ну тогда я рекомендую использовать события . Вы можете использовать события db4o, чтобы определить, когда объект сохраняется, активируется и т. Д. В таком прослушивателе событий вы можете использовать текущую область Autofac для передачи дополнительных услуг.

Btw. материал IActivatable :: Bind () уже вызывается db4o. Вам не нужно больше ничего делать.

В общем, я бы попытался правильно охватить все и не использовать Autofac как сервис-локатор.

...