コード例 #1
0
        static async Task GenerateCodes()
        {
            BitSourceGeneratorBitConfigProvider bitConfigProvider = new BitSourceGeneratorBitConfigProvider(_bitConfigFilePath !, BeingCompiledProjectName);

            BitConfig bitConfig = bitConfigProvider.GetConfiguration();

            using (MSBuildWorkspace workspace = MSBuildWorkspace.Create(new Dictionary <string, string>
            {
                { "TargetFramework", bitConfig.TargetFramework ?? "net5.0" }
            }))
            {
                workspace.SkipUnrecognizedProjects = workspace.LoadMetadataForReferencedProjects = true;

                workspace.WorkspaceFailed += MSBuildWorkspace_WorkspaceFailed;

                foreach (BitCodeGeneratorMapping mapping in bitConfigProvider.GetConfiguration().BitCodeGeneratorConfigs.BitCodeGeneratorMappings)
                {
                    foreach (Bit.Tooling.Core.Model.ProjectInfo proj in mapping.SourceProjects)
                    {
                        if (workspace.CurrentSolution.Projects.Any(p => proj.IsThisProject(p)))
                        {
                            continue; /*It's already loaded*/
                        }
                        string sourceProjetctPath = proj.Name == BeingCompiledProjectName ? ProjectPath : (AllProjectsPaths ?? throw new InvalidOperationException($"There is no solution project and we're unable to find {proj.Name}")).ExtendedSingle($"Trying to find source project {proj.Name}", projPath => Path.GetFileNameWithoutExtension(projPath) == proj.Name);

                        await workspace.OpenProjectAsync(sourceProjetctPath);
                    }

                    if (!workspace.CurrentSolution.Projects.Any(p => mapping.DestinationProject.IsThisProject(p)))
                    {
                        string DestProjetctPath = mapping.DestinationProject.Name == BeingCompiledProjectName ? ProjectPath : (AllProjectsPaths ?? throw new InvalidOperationException($"There is no solution project and we're unable to find {mapping.DestinationProject.Name}")).ExtendedSingle($"Trying to find destination project {mapping.DestinationProject.Name}", projPath => Path.GetFileNameWithoutExtension(projPath) == mapping.DestinationProject.Name);
                        await workspace.OpenProjectAsync(DestProjetctPath);
                    }
                }

                IProjectDtoControllersProvider           controllersProvider = new DefaultProjectDtoControllersProvider();
                IProjectDtosProvider                     dtosProvider        = new DefaultProjectDtosProvider(controllersProvider);
                IBitCodeGeneratorOrderedProjectsProvider bitCodeGeneratorOrderedProjectsProvider = new DefaultBitCodeGeneratorOrderedProjectsProvider();
                IProjectEnumTypesProvider                projectEnumTypesProvider = new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider);

                DefaultTypeScriptClientProxyGenerator tsGenerator = new DefaultTypeScriptClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider,
                                                                                                              bitConfigProvider, dtosProvider
                                                                                                              , new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, projectEnumTypesProvider);

                await tsGenerator.GenerateCodes(workspace);

                DefaultCSharpClientProxyGenerator csGenerator = new DefaultCSharpClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider,
                                                                                                      bitConfigProvider, controllersProvider, new DefaultCSharpClientContextGenerator());

                await csGenerator.GenerateCodes(workspace);
            }
        }
コード例 #2
0
        static async Task GenerateCodes(BitConfig bitConfig, BitSourceGeneratorBitConfigProvider bitConfigProvider)
        {
            using (MSBuildWorkspace workspace = MSBuildWorkspace.Create(new Dictionary <string, string>
            {
                { "TargetFramework", bitConfig.TargetFramework ?? "net6.0" }
            }))
            {
                workspace.SkipUnrecognizedProjects = workspace.LoadMetadataForReferencedProjects = true;

                workspace.WorkspaceFailed += MSBuildWorkspace_WorkspaceFailed;

                foreach (BitCodeGeneratorMapping mapping in bitConfig.BitCodeGeneratorConfigs.BitCodeGeneratorMappings)
                {
                    foreach (Bit.Tooling.Core.Model.ProjectInfo proj in mapping.SourceProjects.Union(new[] { mapping.DestinationProject }))
                    {
                        if (workspace.CurrentSolution.Projects.Any(p => proj == p))
                        {
                            continue; /*It's already loaded*/
                        }
                        string sourceProjetctPath = proj.Name == BeingCompiledProjectName ? ProjectPath : (AllProjectsPaths ?? throw new InvalidOperationException($"There is no solution project and we're unable to find {proj.Name}")).ExtendedSingle($"Trying to find project {proj.Name}", projPath => Path.GetFileNameWithoutExtension(projPath) == proj.Name);

                        await workspace.OpenProjectAsync(sourceProjetctPath).ConfigureAwait(false);
                    }
                }

                IProjectDtoControllersProvider           controllersProvider = new DefaultProjectDtoControllersProvider();
                IProjectDtosProvider                     dtosProvider        = new DefaultProjectDtosProvider(controllersProvider);
                IBitCodeGeneratorOrderedProjectsProvider bitCodeGeneratorOrderedProjectsProvider = new DefaultBitCodeGeneratorOrderedProjectsProvider();
                IProjectEnumTypesProvider                projectEnumTypesProvider = new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider);

                TypeScriptJayDataClientProxyGenerator typeScriptJayDataGeneratedCode = new TypeScriptJayDataClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider,
                                                                                                                                 bitConfigProvider, dtosProvider
                                                                                                                                 , new TypeScriptJayDataClientProxyDtoGenerator(), new TypeScriptJayDataClientContextGenerator(), controllersProvider, projectEnumTypesProvider);

                await typeScriptJayDataGeneratedCode.GenerateCodes(workspace).ConfigureAwait(false);

                CSharpSimpleODataClientProxyGenerator csharpSimpleODataClientGeneratedCode = new CSharpSimpleODataClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider,
                                                                                                                                       bitConfigProvider, controllersProvider, new CSharpSimpleODataClientContextGenerator(), new CSharpSimpleODataClientMetadataGenerator(), dtosProvider, projectEnumTypesProvider);

                await csharpSimpleODataClientGeneratedCode.GenerateCodes(workspace).ConfigureAwait(false);

                CSharpHttpClientProxyGenerator csharpHttpClientProxyGenerator = new CSharpHttpClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider,
                                                                                                                   bitConfigProvider, controllersProvider, new CSharpHttpClientContextGenerator(), dtosProvider, projectEnumTypesProvider);

                await csharpHttpClientProxyGenerator.GenerateCodes(workspace).ConfigureAwait(false);
            }
        }
コード例 #3
0
        public virtual async Task DefaultEnumTypesProviderShouldReturnEnumTypes()
        {
            const string sourceCodes = @"

public interface IDto {
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class DtoWithEnum : IDto
{
    public virtual int Id { get; set; }

    public virtual TestGender? Gender { get; set; }

    public virtual string Test { get; set; }
}

public enum TestGender
{
    Man = 3, Woman = 12, Other
}

public enum TestGender2
{
    Man = 3, Woman = 12, Other
}

public class DtoWithEnumController : DtoController<DtoWithEnum>
{
    public class GetDtoWithEnumsByGenderParameters
    {
        public virtual TestGender gender { get; set; }
    }

    [ActionAttribute]
    public virtual int GetDtoWithEnumsByGender(GetDtoWithEnumsByGenderParameters parameters)
    {
        return 1;
    }

    public class GetDtoWithEnumsByGender2Parameters
    {
        public virtual TestGender2 gender { get; set; }
    }

    [ActionAttribute]
    public virtual int GetDtoWithEnumsByGender2(GetDtoWithEnumsByGender2Parameters parameters)
    {
        return 1;
    }
}

";

            IProjectDtoControllersProvider projectDtoControllersProvider = new DefaultProjectDtoControllersProvider();

            IProjectEnumTypesProvider projectEnumTypesProvider = new DefaultProjectEnumTypesProvider(projectDtoControllersProvider, new DefaultProjectDtosProvider(projectDtoControllersProvider));

            Project proj = CreateProjectFromSourceCodes(sourceCodes);

            IList <EnumType> result = await projectEnumTypesProvider.GetProjectEnumTypes(proj, new[] { proj });

            Assert.IsTrue(result.Select(enumType => enumType.EnumTypeSymbol.Name).SequenceEqual(new[] { "TestGender", "TestGender2" }));

            Assert.IsTrue(result.First().Members.SequenceEqual(new[]
            {
                new EnumMember {
                    Name = "Man", Value = 3, Index = 0
                },
                new EnumMember {
                    Name = "Woman", Value = 12, Index = 1
                },
                new EnumMember {
                    Name = "Other", Value = 13, Index = 2
                }
            }, new EnumMemberEqualityComparer()));
        }
コード例 #4
0
        public virtual async Task NestedObjectsTest()
        {
            string sourceProjectCodes = @"

public interface IDto {

}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class TestComplexController : DtoController<TestComplexDto>
{
    [FunctionAttribute]
    public System.Threading.Tasks.Task<ComplexObj3[]> GetComplexObjects()
    {
        return null;
    }

    public class SomeActionArgs
    {
        public ComplexObj5 Test5 { get; set; }
        public string Test { get; set; }
    }

    [ActionAttribute]
    public void SomeAction(SomeActionArgs args)
    {
        
    }
}

public class TestComplexDto : IDto
{
    public virtual int EntityId { get; set; }

    public virtual ComplexObj ComplexObj { get; set; }

    public virtual ComplexObj2 ComplexObj2 { get; set; }
}

[System.ComponentModel.DataAnnotations.Schema.ComplexType]
public class ComplexObj
{
    public virtual string Name { get; set; }
}

[System.ComponentModel.DataAnnotations.Schema.ComplexType]
public class ComplexObj3
{
    public virtual string Name { get; set; }

    public virtual ComplexObj4 Obj4 { get; set; }
}

[System.ComponentModel.DataAnnotations.Schema.ComplexType]
public class ComplexObj4
{
    public virtual string Name { get; set; }

    public virtual Test Test { get; set; }
}

[System.ComponentModel.DataAnnotations.Schema.ComplexType]
public class ComplexObj5
{
    public virtual string Name { get; set; }

    public virtual Test2 Test2 { get; set; }
}

public enum Test
{
}

public enum Test2
{
}

";

            string otherProjectCodes = @"

namespace System.ComponentModel.DataAnnotations.Schema
{
    public class ComplexTypeAttribute : Attribute
    {
    }
}

[System.ComponentModel.DataAnnotations.Schema.ComplexType]
public class ComplexObj2
{
    public virtual string Name { get; set; }

    public virtual Test Test { get; set; }
}

public enum Test3
{
}

";

            Project otherProject  = CreateProjectFromSourceCodes(otherProjectCodes);
            Project sourceProject = CreateProjectFromSourceCodesWithExistingSolution(otherProject.Solution, sourceProjectCodes);

            sourceProject = sourceProject.AddProjectReference(new ProjectReference(otherProject.Id));

            DefaultProjectDtoControllersProvider dtoControllersProvider = new DefaultProjectDtoControllersProvider();
            DefaultProjectDtosProvider           projectDtosProvider    = new DefaultProjectDtosProvider(dtoControllersProvider);
            DefaultProjectEnumTypesProvider      enumTypesProvider      = new DefaultProjectEnumTypesProvider(dtoControllersProvider, projectDtosProvider);

            Dto[] dtos = (await projectDtosProvider.GetProjectDtos(sourceProject)).ToArray();

            EnumType[] enums = (await enumTypesProvider.GetProjectEnumTypes(sourceProject)).ToArray();

            Assert.IsTrue(dtos.Select(d => d.DtoSymbol.Name).SequenceEqual(new[] { "ComplexObj5", "ComplexObj4", "ComplexObj3", "ComplexObj2", "ComplexObj", "TestComplexDto" }));

            Assert.IsTrue(enums.Select(d => d.EnumTypeSymbol.Name).SequenceEqual(new[] { "Test2", "Test" }));
        }