C# 编译时/编译后依赖项注入IoC?

C# 编译时/编译后依赖项注入IoC?,c#,security,dependency-injection,ninject,fody,C#,Security,Dependency Injection,Ninject,Fody,我目前使用它将接口绑定到具体类型,并将这些类型注入到我的类中。然而,据我所知,这是一个运行时事件。对我来说,如果有人想更改我的应用程序的行为,这似乎是一个攻击点 是否有任何东西允许我将依赖项注入IoC迁移到编译时(阅读:构建后IL编织/替换)? 详述 在我的代码中,我设置了一个绑定 Bind<IFoo>().To<Foo>() Bind<Bar>().ToSelf().InSingletonScope(); 假设我没有服务定位器。所以我不再使用内核了 现在

我目前使用它将接口绑定到具体类型,并将这些类型注入到我的类中。然而,据我所知,这是一个运行时事件。对我来说,如果有人想更改我的应用程序的行为,这似乎是一个攻击点

是否有任何东西允许我将依赖项注入IoC迁移到编译时(阅读:构建后IL编织/替换)?


详述

在我的代码中,我设置了一个绑定

Bind<IFoo>().To<Foo>()
Bind<Bar>().ToSelf().InSingletonScope();
假设我没有服务定位器。所以我不再使用
内核了

现在,我想有一个“构建后发布编译”,用实例化器或对常量/单例的引用等替换内核的解析引擎

var foo = kernel.Get<IFoo>();
再也没有提到NInject了


对于这个问题,我的理由是我正在使用IL编织我所有的PropertyChanged Raiser,我想知道是否有可能为依赖注入做类似的事情

一般来说,从安全角度来看,使用DI容器不会对应用程序造成任何额外威胁

编写服务(如web服务或网站)应用程序时,攻击者只能在应用程序或服务器已被压缩时更改应用程序的DI配置行为。发生这种情况时,服务器应被视为丢失(您必须重新格式化该服务器或将其完全丢弃)。DI并没有让情况变得更糟,因为DI容器通常不允许从外部更改行为。你将不得不做一些非常奇怪的事情来实现这一点

另一方面,对于一个运行在用户机器上的应用程序,你应该总是认为应用程序会被破坏,因为攻击者可以反编译你的代码,在运行时改变行为等等。狄不会使情况变得更糟,因为你只能保护自己免受攻击服务边界的攻击。该客户端应用程序必须与服务器通信,并且存储您的宝贵资产的位置在服务边界内。例如,永远不要在客户端的DLL中存储帐户密码。不管它是否加密

但是,使用DI会使攻击者更容易更改客户端应用程序的行为,尤其是在XML中配置所有内容时。但这适用于存储在配置文件中的所有内容。如果这是你唯一的防线(不管有没有DI),你就完蛋了

如果有人想改变现状,这似乎是一个攻击点 我的应用程序的行为


请注意,任何应用程序都可以反编译、更改和重新编译。不管它是托管的(.NET,Java)还是非托管的(C++),也不管它是否模糊。因此,从安全性的角度来看,无论您是执行运行时DI还是编译时DI,都无关紧要。如果这是一个问题,请不要在您无法控制的机器上部署该代码。

如前所述,您引用的执行此操作的原因并不正确。然而,Philip Laureano(Linfu作者)在一段时间前做了一个预部署DI。不知道它是否在任何地方运行…

我正在使用源代码生成器为.Net开发一个编译时IOC容器:

使用它,您可以执行以下操作:

使用StrongInject;
[注册(类型化(Foo)、类型化(IFoo))]
[注册(typeof(Bar),Scope.SingleInstance)]
公共类容器:IContainer{}
公共静态类程序
{
公共静态void Main()
{
new Container().Resolve(foo=>//在此处使用foo);
}
}

如果无法解决
IFoo
,并避免使用反射,则会出现编译时错误和警告。

IoC的全部目的是在运行时使用它。您能解释一下攻击点的含义吗?您是指有人通过替换您的DLL,将您的一个实现替换为一个恶意的实现吗?如果这是个问题,我建议你看看强名称签名你的DLL。@IlyaIvanov好吧,假设我有IFoo和一些想要IFoo的条。我在代码中设置绑定,编译,运行。NInject内核启动时,我请求Bar,它解决了依赖关系。但我已经编译了绑定定义。我已经在编译我的意图,但是我必须等到运行时才能解析。我在想,我不明白为什么我不能有一个后构建阶段来解析依赖项并用IL编织的代码替换。@ChrisSinclair没有它的假设。我一直在使用
Fody
来编制我的PropertyChanged raisers,我想知道是否可以为NInject做类似的事情。您所说的是后期编译工具,如PostSharp。事实上,这些工具的问题在于它们进行后期编译。这使得单元测试再次变得很难不使用DI(这是进行DI的主要原因之一)。经过反思,这是迄今为止唯一能回答这个问题的答案,而不是我最初提出这个问题的理由。IoC本身就是一个设计概念,不管反转容器的应用程序是在编译时还是在运行时手动执行的。所以我改变了这个被接受的答案。不过,我还是很想看到像伊尔·韦弗这样的福迪P@MeirionHughes哈,是什么花了你这么长时间:D我知道我把另一个答案投了更高的票,因为不管它直接回答了谁,它都是有用的。根据您的评论,唯一合乎逻辑的下一步当然是您利用Hiro作为基础对Fody进行操作:嗯,我一直在寻找制作Fody插件的原因:P
var foo = kernel.Get<IFoo>();
var bar = new Bar(); 
var foo = new Foo(bar);