Я уже давно пользуюсь 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