Подтвердить что ты не робот

Как определить конструктор по умолчанию с помощью StructureMap?

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

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

Я написал это в моем методе "bootstrapper":

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

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

Код исключения StructureMap: 202
Нет экземпляра по умолчанию, определенного для PluginFamily MyNamespace.Data.SqlRepository.MyDataContext, MyNamespace.Data, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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