Ninject为我创建了依赖于B类的A类实例(因此ninject也创建了对象B)。 Ninject配置为返回A类(InSingletonScope)的单个实例和B类(InTrancientScope)的许多实例。 A类具有允许获取/设置对象B的依赖关系的属性。
每次请求同一个A类实例时,是否可以使用新创建的实例B检索A类实例?
OnActivation方法如果在每个请求上执行都会发挥作用,而不仅仅是第一次。
或者这可能是我要做的一些反模式?
修改 为了避免XY问题,我将尝试解释更多细节。解决方案太大了,无法解释所有这么长的故事:
要执行操作,例如盘点。该操作由三个演示者(P1,P2,P3)填充。演示者管理相应的视图(V1,V2,V3)。用户在视图中输入数据,演示者从视图中获取数据并保存到操作。 所有演示者和视图都是单例(InSingletonScope),以避免每次需要时创建对象。视图被注入适当的演示者。 每次操作开始时,都应该创建新的操作实例并注入已经存在的所有演示者。
答案 0 :(得分:0)
每当您从IOC请求Presenter时,它都会返回具有相同Operation Factory的同一演示者。如果将IsValid设置为false,则Operation Factory可以返回相同的对象或新对象。 为解决问题而创建的示例代码:
操作:
public abstract class Operation
{
protected Logger logger;
public Operation(Logger logger)
{
this.logger = logger;
}
}
public class StocktakingOperation : Operation
{
public string test = DateTime.Now.ToString();
public StocktakingOperation(Logger logger)
: base(logger)
{
}
}
工厂:
class OperationFactory<T> where T : Operation
{
private Func<T> ObjectCreation;
private T ValidObject;
public OperationFactory(Func<T> ObjectCreation)
{
IsValid = false;
this.ObjectCreation = ObjectCreation;
}
/// <summary>
/// While is True then the same operation is returned.
/// Set it to False to invalidate current operation so the next call to get operation will return new operation.
/// </summary>
public bool IsValid { get; set; }
public T GetOperation()
{
if (IsValid == false)
{
ValidObject = ObjectCreation();
IsValid = true;
}
return ValidObject;
}
}
class StocktakingOperationFactory : OperationFactory<StocktakingOperation>
{
public StocktakingOperationFactory(Func<StocktakingOperation> ObjectCreation)
: base(ObjectCreation)
{
}
}
<强> PRESENTER 强>
class StocktakingPresenter : BaseOperationPresenter<StocktakingPresentersManager, OPERATION_TYPE>
{
public StocktakingPresenter(QuickForm QuickForm, StocktakingOperationFactory OperationFactory, VIEW_TYPE view, Workspace workspace, Logger logger)
: base(QuickForm, OperationFactory, view, workspace, logger)
{}
}
和IOC:
kernel.Bind<StocktakingOperation>().ToSelf();
kernel.Bind<StocktakingOperationFactory>().ToMethod(c =>
new StocktakingOperationFactory(() => { return kernel.Get<StocktakingOperation>(); })
).InSingletonScope();
kernel.Bind<StocktakingPresenter>().ToSelf().InSingletonScope();