ninject - 在请求期间向现有对象注入依赖项

时间:2016-07-27 15:35:39

标签: c# ninject inversion-of-control

Ninject为我创建了依赖于B类的A类实例(因此ninject也创建了对象B)。 Ninject配置为返回A类(InSingletonScope)的单个实例和B类(InTrancientScope)的许多实例。 A类具有允许获取/设置对象B的依赖关系的属性。

每次请求同一个A类实例时,是否可以使用新创建的实例B检索A类实例?

OnActivation方法如果在每个请求上执行都会发挥作用,而不仅仅是第一次。

或者这可能是我要做的一些反模式?

修改 为了避免XY问题,我将尝试解释更多细节。解决方案太大了,无法解释所有这么长的故事:

要执行操作,例如盘点。该操作由三个演示者(P1,P2,P3)填充。演示者管理相应的视图(V1,V2,V3)。用户在视图中输入数据,演示者从视图中获取数据并保存到操作。 所有演示者和视图都是单例(InSingletonScope),以避免每次需要时创建对象。视图被注入适当的演示者。 每次操作开始时,都应该创建新的操作实例并注入已经存在的所有演示者。

1 个答案:

答案 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();