Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ninject:在每次Get调用中调用一个方法_C#_.net_Dependency Injection_Ninject - Fatal编程技术网

C# Ninject:在每次Get调用中调用一个方法

C# Ninject:在每次Get调用中调用一个方法,c#,.net,dependency-injection,ninject,C#,.net,Dependency Injection,Ninject,我在Ninject上有一个单例绑定,我想在DI解析它时调用一个方法(即每次Get调用)。Ninject具有仅在解析对象时调用的OnActivation方法 我知道,使用瞬态范围将是直观的解决方案,但由于失控的原因。对象必须是单体。您可以通过一些技巧实现这一点。 让我举个例子: const string Name = "Foo"; // Singleton Binding. Will only be used when the context uses the {Name} Bind<Fo

我在Ninject上有一个单例绑定,我想在DI解析它时调用一个方法(即每次Get调用)。Ninject具有仅在解析对象时调用的OnActivation方法


我知道,使用瞬态范围将是直观的解决方案,但由于失控的原因。对象必须是单体。

您可以通过一些技巧实现这一点。 让我举个例子:

const string Name = "Foo";

// Singleton Binding. Will only be used when the context uses the {Name}
Bind<Foo>().To<Foo>()
    .Named(Name)
    .InSingletonScope();

// Unnamed binding with method call on each resolution
Bind<Foo>().ToMethod(ctx => 
    {
        // Do anything arbitrary here. like calling a method...
        return ctx.Kernel.Get<Foo>(Name));
    });
const string Name=“Foo”;
//单件绑定。将仅在上下文使用{Name}时使用
将()绑定到()上
.姓名(姓名)
.InSingletonScope();
//对每个解析调用方法的未命名绑定
Bind().ToMethod(ctx=>
{
//在这里做任何随意的事情。比如调用一个方法。。。
返回ctx.Kernel.Get(Name));
});

当内核请求
Foo
(未命名)时,它将解析为
ToMethod
绑定,您可以在其中插入任意代码。最后,该方法必须使用内核来请求
Foo
,但这次使用的是名称条件。这将解析为命名的单例绑定。

这似乎不是DI框架所支持的。您可能会更幸运地研究这样的东西,它允许您拦截对类/接口的调用members@devNull这实际上是一些DI库所支持的。但我不知道Ninject是否包含这样的特性。虽然有很好的理由使用这种功能,但如果OP能告诉我们他为什么需要它,因为可能有其他(或更有效)的解决方案来解决他的问题,那就太好了。我从未使用过Ninject,但ASP.NET core的DI实现支持设置定义一个工厂方法,在解析服务时调用该方法AddScoped(serviceProvider=>{returnnewresolveme();});`。也许Ninject中也有类似的东西?@Steven,我需要它在每次使用之前重置singleton的属性。@Mostafaabdo:如果是这样,我建议你退一步,重新评估你的设计。每次解决单例时对其进行更改通常不是一个好主意。我建议你更新你的问题,描述你想要达到的目标,并解释你为什么需要这个:显示单例,显示它的用法,并解释为什么需要“重置”。我们可能会就如何改进设计向您提供反馈。