Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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-在请求期间向现有对象注入依赖项_C#_Ninject_Inversion Of Control - Fatal编程技术网

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

C# ninject-在请求期间向现有对象注入依赖项,c#,ninject,inversion-of-control,C#,Ninject,Inversion Of Control,Ninject为我创建了依赖于类B的类A的实例(所以Ninject也创建了对象B)。Ninject配置为返回类A的单个实例(InSingletonScope)和类B的多个实例(InTrancientScope)。 类A具有允许获取/设置对象B的依赖关系的属性 每次我请求类A的相同实例时,是否可以使用新创建的实例B检索类A的实例 如果对每个请求都执行OnActivation方法,而不仅仅是第一次执行,那么它就可以做到这一点 或者这是我要做的反模式 编辑: 为了避免XY问题,我将尝试解释更多细节。这

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

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

如果对每个请求都执行OnActivation方法,而不仅仅是第一次执行,那么它就可以做到这一点

或者这是我要做的反模式

编辑: 为了避免XY问题,我将尝试解释更多细节。这个解决方案太大了,无法解释长话短说的一切:

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

每当您向IOC请求演示者时,它都会返回具有相同操作工厂的相同演示者。如果将IsValid设置为false,则操作工厂可以返回相同对象或新对象。 为解决此问题而创建的示例代码:

操作:

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)
        {

        }
    }
kernel.Bind<StocktakingOperation>().ToSelf();

kernel.Bind<StocktakingOperationFactory>().ToMethod(c =>
            new StocktakingOperationFactory(() => { return kernel.Get<StocktakingOperation>(); })
            ).InSingletonScope();
kernel.Bind<StocktakingPresenter>().ToSelf().InSingletonScope();
工厂:

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)
        {

        }
    }
kernel.Bind<StocktakingOperation>().ToSelf();

kernel.Bind<StocktakingOperationFactory>().ToMethod(c =>
            new StocktakingOperationFactory(() => { return kernel.Get<StocktakingOperation>(); })
            ).InSingletonScope();
kernel.Bind<StocktakingPresenter>().ToSelf().InSingletonScope();
类别操作工厂,其中T:操作
{
私有Func对象创建;
私人T ValidObject;
公共操作工厂(Func对象创建)
{
IsValid=false;
this.ObjectCreation=ObjectCreation;
}
/// 
///如果为True,则返回相同的操作。
///将其设置为False将使当前操作无效,以便下一次调用get操作将返回新操作。
/// 
公共bool有效{get;set;}
公共T GetOperation()
{
if(IsValid==false)
{
ValidObject=ObjectCreation();
IsValid=true;
}
返回有效对象;
}
}
分类盘点操作工厂:操作工厂
{
公共库存操作工厂(Func对象创建)
:base(ObjectCreation)
{
}
}
演示者

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)
        {}


    }
class StocktakingPresenter:BaseOperationPresenter
{
公共盘点演示者(快速表单快速表单,盘点操作工厂操作工厂,视图类型视图,工作区工作区,记录器)
:基本(快速表单、操作工厂、视图、工作区、记录器)
{}
}
和国际奥委会:

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)
        {

        }
    }
kernel.Bind<StocktakingOperation>().ToSelf();

kernel.Bind<StocktakingOperationFactory>().ToMethod(c =>
            new StocktakingOperationFactory(() => { return kernel.Get<StocktakingOperation>(); })
            ).InSingletonScope();
kernel.Bind<StocktakingPresenter>().ToSelf().InSingletonScope();
kernel.Bind().ToSelf();
kernel.Bind().ToMethod(c=>
新StocktakingOperationFactory(()=>{return kernel.Get();})
).InSingletonScope();
kernel.Bind().ToSelf().InSingletonScope();

每当您向IOC请求演示者时,它都会返回具有相同操作工厂的相同演示者。如果将IsValid设置为false,则操作工厂可以返回相同对象或新对象。 为解决此问题而创建的示例代码:

操作:

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)
        {

        }
    }
kernel.Bind<StocktakingOperation>().ToSelf();

kernel.Bind<StocktakingOperationFactory>().ToMethod(c =>
            new StocktakingOperationFactory(() => { return kernel.Get<StocktakingOperation>(); })
            ).InSingletonScope();
kernel.Bind<StocktakingPresenter>().ToSelf().InSingletonScope();
工厂:

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)
        {

        }
    }
kernel.Bind<StocktakingOperation>().ToSelf();

kernel.Bind<StocktakingOperationFactory>().ToMethod(c =>
            new StocktakingOperationFactory(() => { return kernel.Get<StocktakingOperation>(); })
            ).InSingletonScope();
kernel.Bind<StocktakingPresenter>().ToSelf().InSingletonScope();
类别操作工厂,其中T:操作
{
私有Func对象创建;
私人T ValidObject;
公共操作工厂(Func对象创建)
{
IsValid=false;
this.ObjectCreation=ObjectCreation;
}
/// 
///如果为True,则返回相同的操作。
///将其设置为False将使当前操作无效,以便下一次调用get操作将返回新操作。
/// 
公共bool有效{get;set;}
公共T GetOperation()
{
if(IsValid==false)
{
ValidObject=ObjectCreation();
IsValid=true;
}
返回有效对象;
}
}
分类盘点操作工厂:操作工厂
{
公共库存操作工厂(Func对象创建)
:base(ObjectCreation)
{
}
}
演示者

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)
        {}


    }
class StocktakingPresenter:BaseOperationPresenter
{
公共盘点演示者(快速表单快速表单,盘点操作工厂操作工厂,视图类型视图,工作区工作区,记录器)
:基本(快速表单、操作工厂、视图、工作区、记录器)
{}
}
和国际奥委会:

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)
        {

        }
    }
kernel.Bind<StocktakingOperation>().ToSelf();

kernel.Bind<StocktakingOperationFactory>().ToMethod(c =>
            new StocktakingOperationFactory(() => { return kernel.Get<StocktakingOperation>(); })
            ).InSingletonScope();
kernel.Bind<StocktakingPresenter>().ToSelf().InSingletonScope();
kernel.Bind().ToSelf();
kernel.Bind().ToMethod(c=>
新StocktakingOperationFactory(()=>{return kernel.Get();})
).InSingletonScope();
kernel.Bind().ToSelf().InSingletonScope();

您可能不需要将依赖项注入到单例中。将该依赖项的工厂注入到单例中,并在每次需要实例时调用该工厂上的create。您可以随时在服务定位器中注入,以在每次需要时解决依赖项。好的,这是一个解决方案,但我想知道是否有更简单的解决方案。一些.OnResolved方法将非常简单。我想知道为什么没有这样的事情。老实说,这是一个非常简单的解决方案;)注入工厂不适用,因为实际上有几个类(A1、A2、A3…)具有B依赖性。在所有这些类中,B对象在某些范围内使用。从作用域退出并再次进入后,应该创建一个新的B实例。服务定位器不被视为反p吗