Реализация FluentSecurity через Ninject (иначе говоря, перенос StructureMap на Ninject) - PullRequest
1 голос
/ 18 ноября 2011

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

Я реализую контроль безопасности с помощью FluentSecurity *Пакет 1004 * (от NuGet, кстати).Мне нужно реализовать обработчик нарушений политики, как описано в этой вики .Проблема в том, что пример написан для IoC-контейнера StructureMap, и я использую (или пытаюсь) Ninject 2.2 (это казалось более простым для новичка).

На ихкод, они предлагают (а):

configuration.ResolveServicesUsing(type => ObjectFactory.GetAllInstances(type).Cast<object>());

А затем (б):

public class WebRegistry : Registry
{
    public WebRegistry()
    {
        Scan(scan =>
        {
            scan.TheCallingAssembly();
            scan.AddAllTypesOf<IPolicyViolationHandler>();
        });
    }
}

Мои опасения:

  1. Я знаю этот код (а) будет включен в Global.asax.Но какова альтернатива Ninject ObjectFactory.GetAllInstances()?
  2. Я понятия не имею, где этот код должен быть вставлен, и каковы эквиваленты для WebRegistry, Scan и внутренних функций TheCallingAssembly и AddAllTypesOf.

Я знаю, что это довольно обширный вопрос, но я ценю любую помощь!Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 02 июля 2012

Мариус Шульц написал отличную статью, которая должна помочь всем, кто хочет использовать Ninject вместе с FluentSecurity .

Настройка FluentSecurity для использования Ninject для разрешения зависимостей

1 голос
/ 14 февраля 2012

У меня была такая же проблема, как у вас с Ninject. После нескольких часов поиска я загрузил исходный код с github. Я понял код и отладил несколько методов, чтобы выяснить, как разрешить службы. Все, что мне нужно сделать, это предоставить сервисный локатор, чтобы найти обработчики PolicyViolationException.

Похоже, что Ninject эквивалентен этому.

configuration.ResolveServicesUsing(type => System.Web.Mvc.DependencyResolver.Current.GetServices(type));

Я использовал Ninject MVC3 и использовал приведенный ниже код для загрузки модулей из моего текущего веб-проекта MVC и других сборок.

private static void RegisterServices(IKernel kernel)
    {
        kernel.Load("*.dll");
        //kernel.Load(Assembly.GetExecutingAssembly());
    }

Я настроил обработчики PolicyViolationException в моем модуле:

public class MainWebNinjectModule : NinjectModule
{
    public override void Load()
    {
        // other bindings here
        Bind<IPolicyViolationHandler>().To<DenyAnonymousAccessPolicyViolationHandler>();
    }
}

Другие необходимые зависимости, такие как ISecurityHandler, ISecurityContext и т. Д., Разрешаются внутренним IoC, используемым в FluentSecurity.

1 голос
/ 18 ноября 2011

Я думаю, это было бы примерно равнозначно

//add an instance of IKernel to your MvcApplication
[Inject]
public IKernel Kernel { get; set; }
...
configuration.ResolveServicesUsing(type => Kernel.GetAll(type));

Чтобы получить возможность сканировать сборку на наличие зависимостей, вам понадобится расширение для ninject по имени Ninject.Extensions.Conventions , которое смоделировано по аналогии с именем SM.

public class WebModule : NinjectModule
{
    public WebModule()
    {
        Kernel.Scan(a => {
                    a.FromAssemblyContaining<YourType>();
                    a.BindWithDefaultConventions();
                    a.InTransientScope();
                });
    }
}

Бизнес по сканированию сборок, очевидно, не является строго необходимым для того, что вы делаете, это будет работать так же хорошо. Лично я не фанат сканирования сборок, потому что он кажется немного «волшебным», а когда он не работает, отлаживать не весело.

Kernel.Bind<YourType>().ToSelf();
...