DoCli/Objects/Services/ApplicationServiceContainer.psm1

using module "..\Environment\ReadProcessLocation.psm1";
using module "..\Environment\SetProcessLocation.psm1";
using module "..\Processing\ProcessBuilder.psm1";
using module "..\Processing\DisplayReports.psm1";
using module "..\Testing\ModuleTestRunner.psm1";
using module "..\Testing\ProcessTesterRunner.psm1";
using module "..\Testing\PesterConfig.psm1";
using module "..\Testing\PesterRunner.psm1";
using module "..\Testing\ProxyClassTypeDefinitionBuilder.psm1";
using module "..\Mappers\RunMethodInfoMapper.psm1";
using module "..\Validators\ProxyTypeValidator.psm1";

using namespace DoFramework.Data;
using namespace DoFramework.Domain;
using namespace DoFramework.Environment;
using namespace DoFramework.FileSystem;
using namespace DoFramework.Logging;
using namespace DoFramework.Processing;
using namespace DoFramework.Services;
using namespace DoFramework.Validators;
using namespace DoFramework.Mappers;
using namespace DoFramework.Modules;
using namespace DoFramework.Types;
using namespace DoFramework.Testing;
using namespace System.Reflection;
using namespace System.Collections.Generic;
using namespace System.Management.Automation;

<#
.SYNOPSIS
Class for creating the application service container within the DoFramework environment.

.DESCRIPTION
The ApplicationServiceContainer class is designed to register and configure all
necessary services within the DoFramework environment. It sets up various
service dependencies and returns an initialized service container.
#>

class ApplicationServiceContainer {
    <#
    .SYNOPSIS
    Creates and configures the service container.

    .DESCRIPTION
    The Create method registers all necessary services, including file management,
    JSON conversion, environment settings, data providers, mappers, validators,
    and more. It returns an initialized service container with all dependencies.
    #>

    static [IServiceContainer] Create() {
        [IServiceContainer] $container = [ServiceContainer]::new();

        $container.RegisterService[IFileManager, FileManager]();
        $container.RegisterService[IJsonConverter, JsonConverter]();
        $container.RegisterService[IEnvironment, DoFramework.Environment.Environment]();
        $container.RegisterService[ISimpleDataProvider[ProjectContents], ReadProjectContents]();
        $container.RegisterService[ISimpleDataProvider[Dictionary[string, object]], EnvFileDataProvider]();
        $container.RegisterService[IDataCollectionProvider[TestDescriptor, string], TestProvider]();
        $container.RegisterService[IDataCollectionProvider[ProcessDescriptor, string], ProcessProvider]();
        $container.RegisterService[IDataCollectionProvider[ModuleDescriptor, string], ModuleProvider]();
        $container.RegisterService[ISetProcessLocation, SetProcessLocation]();
        $container.RegisterService[IReadProcessLocation, ReadProcessLocation]();
        $container.RegisterService[IConsoleWrapper, ConsoleWrapper]();
        $container.RegisterService[ILogger, Logger]();
        $container.RegisterService[IMapper[ProjectContentsStorage, ProjectContents], ReadProjectContentsMapper]();
        $container.RegisterService[IMapper[ProjectContents, ProjectContentsStorage], SaveProjectContentsMapper]();
        $container.RegisterService[IMapper[string, TestDescriptor], TestDescriptorMapper]();
        $container.RegisterService[IMapper[string, ProcessDescriptor], ProcessDescriptorMapper]();
        $container.RegisterService[IMapper[string, ModuleDescriptor], ModuleDescriptorMapper]();
        $container.RegisterService[IMapper[object, MethodInfo], RunMethodInfoMapper]();
        $container.RegisterService[IValidationErrorWriter, ValidationErrorWriter]();
        $container.RegisterService[IValidator[IDescriptor], DescriptorCreatorValidator]();
        $container.RegisterService[TestDescriptorCreatorValidator]();
        $container.RegisterService[IValidator[IProcessingRequest], ProcessingRequestValidator]();
        $container.RegisterService[IValidator[Type], ProcessTypeValidator]();
        $container.RegisterService[IDataCreator[TestDescriptor], TestCreator]();
        $container.RegisterService[IDataDeletor[TestDescriptor], TestDeletor]();
        $container.RegisterService[IDataCreator[ProcessDescriptor], ProcessCreator]();
        $container.RegisterService[IDataDeletor[ProcessDescriptor], ProcessDeletor]();
        $container.RegisterService[IDataCreator[ModuleDescriptor], ModuleCreator]();
        $container.RegisterService[IDataDeletor[ModuleDescriptor], ModuleDeletor]();
        $container.RegisterService[IDataCreator[ProjectContents], SaveProjectContents]();
        $container.RegisterService[IContext, Context]();
        $container.RegisterService[IProcessInstanceRunner, ProcessInstanceRunner]();
        $container.RegisterService[IProcessExecutor, ProcessExecutor]();
        $container.RegisterService[IProcessRunner, ProcessRunner]();
        $container.RegisterService[IProcessDispatcher, ProcessDispatcher]();
        $container.RegisterService[ISession, Session]();
        $container.RegisterService[IDisplayReports, DisplayReports]();
        $container.RegisterService[IProcessBuilder, ProcessBuilder]();
        $container.RegisterService[IComputeHierarchyPrefix, ComputeHierarchyPrefix]();
        $container.RegisterService[IFailedReportChecker, FailedReportChecker]();
        $container.RegisterService[ILookupProcessType, LookupProcessType]();
        $container.RegisterService[IContextWriter, ContextWriter]();
        $container.RegisterService[IConsumeEnvFiles, ConsumeEnvFiles]();
        $container.RegisterService[ITestRunner[ModuleDescriptor], ModuleTestRunner]();
        $container.RegisterService[ITestRunner[ProcessDescriptor], ProcessTesterRunner]();
        $container.RegisterService[IResolver[ProcessDescriptor], ProcessResolver]();
        $container.RegisterService[IResolver[ModuleDescriptor], ModuleResolver]();
        $container.RegisterService[IResolver[TestDescriptor], TestResolver]();
        $container.RegisterService[PesterConfig]();
        $container.RegisterService[IPesterRunner, PesterRunner]();
        $container.RegisterService[IDescriptorFileCreator[ProcessDescriptor], ProcessDescriptorFileCreator]();
        $container.RegisterService[IDescriptorFileCreator[ModuleDescriptor], ModuleDescriptorFileCreator]();
        $container.RegisterService[IDescriptorFileCreator[TestDescriptor], TestDescriptorFileCreator]();
        $container.RegisterService[IOSSanitise, OSSanitise]();
        $container.RegisterService[ProxyTypeValidator]();
        $container.RegisterService[ProxyClassTypeDefinitionBuilder]();

        return $container;
    }
}