我是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>();
});
}
}
我的担忧:
Global.asax
中。但是Ninject可以替代ObjectFactory.GetAllInstances()
?WebRegistry
,Scan
以及内部函数TheCallingAssembly
和AddAllTypesOf
的等价物。我知道这是一个广泛的问题,但我感谢任何帮助!提前谢谢。
答案 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解析。