1

我是 IoC 和依赖注入的初学者。我正在阅读它,但我无法理解。当我弄清楚东西是如何工作的时,我正在尝试在我的项目中实现其中的一些模式(并且可能通过反复试验来学习)。

我正在使用FluentSecurity包(来自 NuGet,顺便说一句)实现安全控制。我需要实现一个策略违规处理程序,如本 wiki中所述。问题是该示例是为 StructureMap IoC 容器编写的,而我正在使用(或尝试)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. 我不知道应该在哪里插入这段代码,也不知道WebRegistry,Scan和内部函数TheCallingAssemblyAddAllTypesOf.

我知道这是一个有点广泛的问题,但我很感激任何帮助!提前致谢。

4

3 回答 3

3

Marius Schulz 写了一篇优秀的文章,应该可以帮助任何想要将 Ninject 与FluentSecurity一起使用的人。

设置 FluentSecurity 以使用 Ninject 进行依赖解析

于 2012-07-02T09:21:37.377 回答
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();
于 2011-11-18T14:21:55.683 回答
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 解决。

于 2012-02-14T10:55:05.587 回答