Как определить конструктор по умолчанию с помощью кода, используя StructureMap? - PullRequest
15 голосов
/ 14 ноября 2008

Я не могу понять, как определить конструктор по умолчанию (если он существует с перегрузками) для типа в StructureMap (версия 2.5) по коду.

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

Я написал это в моем методе «начальной загрузки»:

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>();

Когда я запускаю свое приложение, я получаю эту ошибку:

Код исключения StructureMap: 202
Экземпляр по умолчанию не определен для PluginFamily MyNamespace.Data.SqlRepository.MyDataContext, MyNamespace.Data, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = ноль

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

Обновление: О, и я забыл сказать, что не буду использовать атрибут [StructureMap.DefaultConstructor].

Ответы [ 3 ]

30 голосов
/ 18 ноября 2008

Вы можете указать конструктор с помощью ConstructedBy (). Пожалуйста, попробуйте это:

ForRequestedType<MyDataContext>().TheDefault.
Is.ConstructedBy(() => new MyDataContext());

Это сработало для меня.

5 голосов
/ 13 марта 2010

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

ForRequestedType< MyDataContext >()
            .CacheBy( InstanceScope.PerRequest )
            .TheDefault.Is.OfConcreteType< MyDataContext >()

SelectConstructor< MyDataContext >( () => new MyDataContext());

С помощью этого кода вы также можете добавить определения интерфейсов в конструктор MyDataContext, как это

SelectConstructor< MyDataContext >( () => new MyDataContext((IDatabaseFactory)null ));

Просто не забудьте определить конкретный тип с StructureMap для вашего экземпляра IDatabaseFactory.

0 голосов
/ 14 ноября 2008

Я не уверен, как / если это можно сделать с помощью свободного интерфейса / внутреннего DSL. Однако вы можете использовать атрибут, если вы не беспокоитесь о загрязнении вашего домена ?

Пометьте ваш предпочтительный конструктор с помощью [DefaultConstructor]. По умолчанию StructureMap является самым жадным конструктором (конструктор с наибольшим количеством параметров).

...