Skip to content

Can anybody tell me why I only get one object in the accumulator? #68

Closed

Description

@UMDev-Brian
public sealed class SetupSteps : List<ISetupStep>;
var config = DI.Setup(nameof(Composition))
.Accumulate<ISetupStep, SetupSteps>(Lifetime.Transient)
.Bind<ISetupStep>().As(Lifetime.Transient).To<LoadConfigs>()
.Bind<ISetupStep>().As(Lifetime.Transient).To<CoreSetupStep>()
.Root<(ISetupStep step, SetupSteps steps)>("Root")

The objects in question:

public abstract class SetupStep : ISetupStep
{
   //protected Composition _composition;
    // public SetupStep(Composition composition)
    // {
    //     _composition = composition;
    // }

    public abstract bool IsComplete();
    public abstract Task<bool> RunAsync(Composition composition, INavigationService frame);
}

public sealed class CoreSetupStep : SetupStep
{
    //public CoreSetupStep(Composition composition) : base(composition) { }
    public override bool IsComplete()
    {
        return true;
    }

    public override async Task<bool> RunAsync(Composition composition, INavigationService frame)
    {
        //do core setup
        return true;
    }

}

public sealed class LoadConfigs : SetupStep
{
   // public LoadConfigs(Composition composition) : base(composition) { }
    
    public override bool IsComplete()
    {
        return false;
        // return _composition.Settings == null || _composition.Settings.DbConfig == null || _composition.Settings.SquareConfig == null ||
        //        _composition.Settings.AzureConfig == null;
    }

    public override Task<bool> RunAsync(Composition composition, INavigationService frame)
    {
        //_composition = composition;
        //do services setup
        FlourishSettingsProvider.Initialize(composition);//TODO: this could be async
        return Task.FromResult(IsComplete());
    }

}

Activity

  1. NikolayPianikov commented on Aug 14, 2024

    @NikolayPianikov
    Member

    The accumulator contains one object, because in fact one object of ISetupStep type was created.
    To embed two objects you can embed a collection as in the example below. Also you have an error in the line .Bind<ISetupStep>().As(Lifetime.Transient).To<CoreSetupStep>() you have overridden the binding .Bind<ISetupStep>().As(Lifetime.Transient).To<LoadConfigs>() with a new one, the generator warned about it. To add a new one it can be labelled with some tag, in the example below it is ‘abc’.

    DI.Setup(nameof(Composition))
        .Accumulate<ISetupStep, SetupSteps>(Lifetime.Transient)
        .Bind<ISetupStep>().As(Lifetime.Transient).To<LoadConfigs>()
        .Bind<ISetupStep>("abc").As(Lifetime.Transient).To<CoreSetupStep>()
        .Root<(IReadOnlyCollection<ISetupStep> allSteps, SetupSteps steps)>("Root");
    
    var composition = new Composition();
    var root = composition.Root;
    var steps = root.steps;
    
    return 0;
    
    internal sealed class SetupSteps : List<ISetupStep>;
    
    internal interface ISetupStep;
    
    internal interface INavigationService;
        
    internal abstract class SetupStep : ISetupStep
    {
        //protected Composition _composition;
        // public SetupStep(Composition composition)
        // {
        //     _composition = composition;
        // }
    
        public abstract bool IsComplete();
        
        public abstract Task<bool> RunAsync(Composition composition, INavigationService frame);
    }
    
    internal sealed class CoreSetupStep : SetupStep
    {
        //public CoreSetupStep(Composition composition) : base(composition) { }
        public override bool IsComplete()
        {
            return true;
        }
    
        public override async Task<bool> RunAsync(Composition composition, INavigationService frame)
        {
            //do core setup
            return true;
        }
    }
    
    internal sealed class LoadConfigs : SetupStep
    {
        // public LoadConfigs(Composition composition) : base(composition) { }
    
        public override bool IsComplete()
        {
            return false;
            // return _composition.Settings == null || _composition.Settings.DbConfig == null || _composition.Settings.SquareConfig == null ||
            //        _composition.Settings.AzureConfig == null;
        }
    
        public override Task<bool> RunAsync(Composition composition, INavigationService frame)
        {
            //_composition = composition;
            //do services setup
            return Task.FromResult(IsComplete());
        }
    }
  2. UMDev-Brian commented on Aug 14, 2024

    @UMDev-Brian
    Author

    Thanks for the explanation! That makes a lot of sense. I will make the relevant changes.

  3. locked and limited conversation to collaborators on Aug 21, 2024
  4. converted this issue into a discussion #71 on Aug 21, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

questionFurther information is requested

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions