Использование StructureMap в областях ASP.NET MVC - PullRequest
0 голосов
/ 08 декабря 2011

Я использую StructureMap для IoC, и он отлично работает для обычных контроллеров, но я не могу заставить его работать с областями.У меня есть AccountController в области администрирования:

public class AccountController : Controller
{
    private readonly IFormsAuthenticationService formsService;
    private readonly IMembershipService membershipService;

    public AccountController(IFormsAuthenticationService formsService, IMembershipService membershipService)
    {
        this.formsService = formsService;
        this.membershipService = membershipService;
    }
    ...
}

И вот ошибка:

System.InvalidOperationException: An error occurred when trying to create a controller of type 'Foo.Areas.Administration.Controllers.AccountController'. Make sure that the controller has a parameterless public constructor. ---> System.MissingMethodException: No parameterless constructor defined for this object.

Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ

StructureMap не удалось разрешить MembershipProvider.
Вот решение:

For<MembershipProvider>().Use(Membership.Providers["AspNetSqlMembershipProvider"]);

1 Ответ

0 голосов
/ 08 декабря 2011

Я сомневаюсь, что это проблема с областями, потому что я использую их с удовольствием. Это, скорее, проблема чистого МОК. Вы получаете эту ошибку, когда один из внедренных сервисов не может быть разрешен вашим контейнером, что приводит к тому, что контейнер не может соответствовать сигнатуре для конструктора и пытается вернуться к пустому конструктору, который не существует, правильно.

Итак, мой первый инстинкт - убедиться, что две введенные службы доступны. Возможно, что один из них не был создан должным образом; Распространенной причиной является то, что поставщик членства не может подключиться к своей базе данных или подобному.

Для диагностики в вашем global.asax после создания контейнера посмотрите, можете ли вы разрешить эти две службы вручную. Я не знаю СМ, но что-то вроде:

var s = container.Resolve<IMembershipService>();

Удостоверьтесь, что обе эти услуги могут быть разрешены.

...