Определите конструктор по умолчанию с StructureMap без предоставления аргументов или использования атрибута DefaultConstructor - PullRequest
1 голос
/ 12 июля 2009

Я уже давно пользуюсь StructureMap, но я далеко не эксперт. Моя проблема проста, я пытаюсь настроить SM с помощью кода (реестра) для использования определенного конструктора при создании экземпляра объекта репозитория.

Вот мои 2 конструктора (обратите внимание, что ни один из них не самый жадный).

public BusinessUnitRepository( IDatabase database )
    : base( database ) {

}

public BusinessUnitRepository( IDatabaseFactory factory )
    : base( factory ) {

}

Примечание. Первый конструктор принимает экземпляр интерфейса IDatabase и вызывается реализацией ctor (IDatabaseFactory) базового класса.

Я пытаюсь настроить SM на использование второго конструктора и предоставить экземпляр DatabaseFactory из контейнера SM. Я не могу использовать атрибут [DefaultConstructor] в сборке, где определен BusinessUnitRepository, поэтому эта опция не включена.

Код моего реестра

ForRequestedType<IDatabaseFactory>()
    .CacheBy( InstanceScope.PerRequest )
    .TheDefaultIsConcreteType<DatabaseFactory>();


ForRequestedType<Repository.IBusinessUnitRepository>()
    .CacheBy( InstanceScope.PerRequest )
    .TheDefault.Is.OfConcreteType<BusinessUnitRepository>().CtorDependency<IDatabaseFactory>().Is<DatabaseFactory>();

При запуске программы SM выдает ошибку 302 при попытке создать экземпляр BusinessUnitRepository.

StructureMap.StructureMapException: StructureMap Exception Code:  302
There is no argument of type Repository.LinqToSql.IDatabaseFactory for concrete type Repository.LinqToSql.BusinessUnitRepository

К вашему сведению:

  • Если я ссылаюсь на StructureMap в сборке Repository.LinqToSql.BusinessUnitRepository и использую атрибут [DefaultConstructor] в моем конструкторе IDatabaseFactory, все работает отлично.
  • Также я подтвердил, что StructureMap содержит настроенный репозиторий.LinqToSql.DatabaseFactory

1 Ответ

0 голосов
/ 13 июля 2009

Я нашел решение, но в "магии" есть вонь:

ForRequestedType<Repository.IBusinessUnitRepository>()
            .CacheBy( InstanceScope.PerRequest )
            .TheDefault.Is.OfConcreteType<BusinessUnitRepository>()
            .CtorDependency<IDatabaseFactory>("factory").IsTheDefault();

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

Я все еще думаю, что есть лучший ответ. Поскольку у меня довольно много интерфейсов репозитория и конкретной реализации, кажется, что для определения типа SelectConstructor для каждого типа требуется много работы. Я открыт для предложений.

...