c# – Ninject Memoize Singleton Scope中的实例

c# – Ninject Memoize Singleton Scope中的实例,第1张

概述我正在使用Ninject来实例化一些带有构造函数arg的对象,例如: class MyClass{ public MyClass(string myArg) { this.myArg = myArg; }} 我需要这个类的实例数量直到运行时才知道,但我想要做的是确保myArg的每个变体产生一个不同的单例实例(因此要求两次相同的值会返回相同的实例,但是不同 我正在使用Ninject来实例化一些带有构造函数arg的对象,例如:
class MyClass{    public MyClass(string myArg)    {        this.myArg = myArg;    }}

我需要这个类的实例数量直到运行时才知道,但我想要做的是确保myArg的每个变体产生一个不同的单例实例(因此要求两次相同的值会返回相同的实例,但是不同的args返回不同的实例).

有没有人知道一个好的,最好是内置的方式这样做?

我找到了一篇为Ninject How To Ensure One Instance per Variation of Activation Parameters的旧版本编写的文章,但希望有更新版本的更整洁的解决方案.

编辑

以下是我使用的内容,改编自Akim的答案如下:

private Readonly ConcurrentBag<string> scopeParameters = new ConcurrentBag<string>();internal object ParameterScope(IContext context,string parametername){    var param = context.Parameters.First(p => p.name.Equals(parametername));    var paramValue = param.GetValue(context,context.Request.Target) as string;    paramValue = string.Intern(paramValue);    if (paramValue != null && !scopeParameters.Contains(paramValue))    {        scopeParameters.Add(paramValue);    }    return paramValue;}public overrIDe voID Load(){    Bind<MyClass>()            .ToSelf()            .InScope(c => ParameterScope(c,"myArg"));    Bind<IMyClassFactory>()        .ToFactory();}
@H_404_16@解决方法 您可以通过使用IBindingnameDWithOrOnSyntax< T>提供自定义范围来实现需求行为.用于MyClass绑定的InScope(Func< IContext,object> scope)方法

Indicates that instances activated via the binding should be re-used
as long as the object returned by the provIDed callback remains alive
(that is,has not been garbage collected).

因此,您需要从Func< IContext,object>返回第一个构造函数参数的值. scope并确保garbage-collector不会收集它.

这是一个片段:

public class Module : NinjectModule{    // stores string myArg to protect from CG    ConcurrentBag<string> ParamSet = new ConcurrentBag<string>();    public overrIDe voID Load()    {        Bind<MyClass>()            .ToSelf()            // custom scope            .InScope((context) =>                {                    // get first constructor argument                    var param = context.Parameters.First().GetValue(context,context.Request.Target) as string;                                        // retrIEves system reference to string                    param = string.Intern(param);                    // protect value from CG                    if(param != null && ParamSet.Contains(param))                    {                        // protect from GC                        ParamSet.Add(param);                    }                    // make Ninject to return same instance for this argument                    return param;                });    }}

ps:full sample code with unittests

@H_404_16@ @H_404_16@ 总结

以上是内存溢出为你收集整理的c# – Ninject Memoize Singleton Scope中的实例全部内容,希望文章能够帮你解决c# – Ninject Memoize Singleton Scope中的实例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1252603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存