Tôi đang sử dụng Ninject để nhanh chóng một số đối tượng với một arg constructor trôi qua, ví dụ:Instances Ninject Memoize trong Singleton Phạm vi
class MyClass
{
public MyClass(string myArg)
{
this.myArg = myArg;
}
}
Số trường hợp tôi cần của lớp này sẽ không được biết cho đến khi thời gian chạy, nhưng những gì tôi muốn làm là đảm bảo rằng mỗi biến thể của myArg
kết quả trong một cá thể singleton khác nhau (do đó yêu cầu cùng một giá trị hai lần trả về cùng một cá thể, nhưng các arg khác nhau trả về các cá thể khác nhau).
Có ai biết cách tốt nhất, được tích hợp sẵn, cách thực hiện việc này không?
Tôi đã tìm thấy một bài viết được viết cho phiên bản cũ hơn của Ninject How To Ensure One Instance per Variation of Activation Parameters nhưng hy vọng sẽ có một giải pháp gọn gàng hơn cho phiên bản mới hơn.
Sửa
Dưới đây là những gì tôi đã đi với, chuyển thể từ câu trả lời Akim của dưới đây:
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();
}
Kiểm tra [ 'ninject.extensions.factory'] (https://github.com/ninject/ninject.extensions.factory) cho thực hiện tự động của nhà máy trừu tượng – Akim