在Ninject上实现FluentSecurity(也就是将StructureMap移植到Ninject)

时间:2011-11-18 13:09:37

标签: inversion-of-control ninject structuremap fluent-security

我是IoC和依赖注入的初学者。我正在读它,但我无法得到它。 当我弄清楚东西是如何工作的时候,我正试图在我的项目中实现一些这些模式(也许可以通过反复试验来学习)。

我正在使用FluentSecurity包(来自NuGet,btw)实现安全控制。我需要实现一个策略违规处理程序,如this wiki所述。问题是该示例是为StructureMap IoC-container编写的,我正在使用(或尝试) Ninject 2.2 (对初学者来说似乎更简单)。

在他们的代码中,他们建议(a):

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

然后(b):

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

我的担忧:

  1. 我知道代码(a)将包含在Global.asax中。但是Ninject可以替代ObjectFactory.GetAllInstances()
  2. 我不知道应该在哪里插入此代码,也不知道WebRegistryScan以及内部函数TheCallingAssemblyAddAllTypesOf的等价物。
  3. 我知道这是一个广泛的问题,但我感谢任何帮助!提前谢谢。

3 个答案:

答案 0 :(得分:3)

Marius Schulz撰写了一篇精彩的文章,可以帮助任何想要将Ninject与FluentSecurity一起使用的人。

Setting Up FluentSecurity to Use Ninject for Dependency Resolution

答案 1 :(得分:1)

我认为这将是大致相当的

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

为了能够扫描程序集中的依赖项,您需要一个名为Ninject.Extensions.Conventions的ninject扩展,它是在SM之后建模的。

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

对于你正在做的事情,装配扫描业务显然不是严格必要的,这也可以。就个人而言,我不是装配扫描的粉丝,因为它看起来有点过于“神奇”,当它不起作用时,调试起来并不好玩。

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

答案 2 :(得分:1)

我和Ninject一样有同样的问题。经过几个小时的谷歌搜索后,我从github下载了源代码。我理解了代码并调试了一些方法来弄清楚如何解析服务。我所要做的就是提供一个服务定位器来查找PolicyViolationException处理程序。

Ninject等价似乎是这样的。

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

我使用了Ninject MVC3,并使用下面的代码从我当前的MVC Web项目加上其他程序集加载模块。

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等,由FluentSecurity中使用的内部IoC解析。