Использование IoC для изменения объекта при его создании - PullRequest
1 голос
/ 06 января 2011

Мне нужна клейкая лента ... У меня есть сценарий, когда два объекта, поддерживаемые двумя отдельными базами данных (на отдельных серверах), должны быть связаны друг с другом.У меня есть объектный граф, но из-за некоторых других «функций» приложения я не могу полагаться на O / RM для сопоставления отношений;Мне нужно вручную заполнить это конкретное отношение, когда я получу тот или иной экземпляр класса.

У меня есть пара методов расширения, которые помогают с этим, но теперь, когда я смотрю на долгий путь поиска всехВ тех местах моего приложения, где мне нужно теперь вызывать этот метод расширения, я пытаюсь найти способ сделать это на глобальном уровне, когда создается один из объектов.Невозможно сделать это в конструкторах объектов по причинам, созданным ранее упомянутыми «функциями».

Есть ли способ использовать контейнер IoC для перехвата / перехвата, когда создается конкретный объект (не обязательносценарий типа DI) и вносить изменения в этот объект до его использования?Как какой-то обработчик событий «OnActivation»?

В некотором роде, я знаю ... Для чего это стоит, это приложение MVC 2, использующее NHibernate, Autofac, и много сплетни и хрусталя.

Ответы [ 4 ]

2 голосов
/ 06 января 2011

Вы имеете в виду, кроме OnActivated события Autofac?

например:.

var builder = new ContainerBuilder();

builder.RegisterType<MyComponent>()
    .OnActivated(e => DoSomething(e.Instance));
1 голос
/ 07 января 2011

Пара соответствующих ответов дана, но я хотел опубликовать и мое решение, которое полностью обошло IoC. Делегаты на помощь!

Поскольку у меня действительно была возможность изменять основной объект, о котором идет речь, я добавил к нему статическое свойство Func<T>, которое ожидает возврата экземпляра класса из моей второй сборки / базы данных. Я также создал геттер для блуждающего типа, который просто вызывает делегат, если он не нулевой. При запуске моего приложения (в моем случае global.asax) я затем установил для статического Func соответствующий метод. Вуаля! У меня есть объектный граф, который я жаждал и эффективно обошел ограничения существующей архитектуры без ненужных замусоренных зависимостей.

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

Я не думаю, что вы можете делать такие вещи, используя МОК.Я предполагаю, что вы не можете изменить реализацию этого класса.Вы можете достичь этого, используя инструмент, подобный postsharp .С его помощью вы сможете перехватывать вызовы конструктора и вставлять в них собственный код.

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

То, что вы хотите, на самом деле не является задачей IoC, и на самом деле нет никакого способа наблюдать за созданием экземпляра типа объекта где-либо во время выполнения без централизации места создания этих объектов.

Если вам нужно создать экземпляр одного или другого объекта и в ходе этого процесса убедиться, что экземпляр другого объекта создан и на него ссылается первый, я думаю, что лучшим шаблоном будет фабрика, возможно, используемая IoC путем регистрации фабричного метода , Затем объектам, создающим любой из этих объектов, будет передан дескриптор метода фабрики или самой фабрики (фабрика может иметь одноэлементную область в контейнере и иметь ссылку на одну фабрику везде).

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