2009-08-14 1 views
2

При использовании NHibernate вы определяете свои полномочия с помощью виртуальных методов, а NHibernate создаст прокси-объект, который отслеживает изменения вашего объекта.Как Moq и NHibernate автоматически создают производные типы?

В Moq каркас волшебным образом создаст производный тип из интерфейса или базового класса. например

var mock = new Mock<IFoo>(); 
IFoo magicFoo = mock.Object; 

Это действительно здорово. Как это делают эти рамки? Используют ли они отражение, дженерики, какую-то динамическую компиляцию или что-то еще?

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

ответ

3

Moq использует Castle Dynamic Proxy, однако, просто подумал, что стоит добавить, что есть еще несколько фреймворков, которые позволяют создавать объекты прокси. По NHibernate 2.1 также позволяет использовать один из следующих вариантов:

Каждый из этих проектов имеет краткое объяснений того, как они достигают этого , который, мы надеемся, тот ответ, который вы ищете.

2

Они используют комбинацию отражения (чтобы выяснить, что нужно сгенерировать) и отражать-излучать (чтобы генерировать производный класс динамически и испускать ИЛ для методов). .NET предоставляет оба этих API (отражение и отражение-излучение).

+1

Если вы не против использования бета-материалов, .NET Framework 4 фактически позволяет вам вызывать компилятор во время выполнения, поэтому вы можете сгенерировать его из кода C#, а не прибегать к ilasm и т. Д. –

Смежные вопросы