strucutreMap Внедрение зависимостей не работает
В моем приложении я настроил структуру карты как
public class DefaultRegistry : Registry {
#region Constructors and Destructors
public DefaultRegistry() {
Scan(
scan => {
scan.Assembly("Eterp.Data.ErpCore");
scan.Assembly("Eterp.Data.Seed");
scan.Assembly("Eterp.Application.ErpCore");
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
ForConcreteType<AclAuthorizationManager>().Configure.Ctor<IResourceOperationAppService>()
}
#endregion
}
И у меня есть класс
public class AclAuthorizationManager : ClaimsAuthorizationManager
{
private readonly IResourceOperationAppService _resourceOperationAppService;
public AclAuthorizationManager(IResourceOperationAppService resourceOperationAppService)
{
_resourceOperationAppService = resourceOperationAppService;
}
public override bool CheckAccess(AuthorizationContext context)
{
var isCurrentUserAuthorized = context.Principal.Identity.IsAuthenticated;
return isCurrentUserAuthorized && _resourceOperationAppService.CanAccessResource(context.Action.FirstOrDefault().Value, context.Principal.Claims);
}
}
Этот класс является пользовательским классом авторизации утверждений, использующимся в моем приложении, но когда я исключаю приложение, я получаю ошибку, связанную с отсутствием параметра, требуемого конструктором (этот класс имеет конструктор с типом параметра IResourceOperation). но я уже настроил все детали в StructureMap . Я уверен, что моя конфигурация структуры карты работает на 100%, ожидайте создания этого класса AclAuthorizationManager. Потому что я могу применять DI в других классах.
Что не так в моем коде?
1 ответ
По моему опыту при указании конструктора типа надо сказать, что наследует от интерфейса.
Поэтому вы должны заменить эту строку:
ForConcreteType<AclAuthorizationManager>().Configure.Ctor<IResourceOperationAppService>()
От:
ForConcreteType<AclAuthorizationManager>().Configure.Ctor<IResourceOperationAppService>().Is<ResourceOperationAppService>()
Где находится реализация ResourceOperationAppService IResourceOperationAppService.