MagicOnion icon indicating copy to clipboard operation
MagicOnion copied to clipboard

`[MagicOnionClientGeneration]` does not generate inherited service methods

Open monry opened this issue 9 months ago • 0 comments

When generating client-side code using the [MagicOnionClientGeneration] attribute, methods are not generated if the interface inherits from anything other than IService<T>.

If an interface like the following exists, the FooAsync() method will not be generated.

namespace Sample.Shared;

public interface IFooService
{
    UnaryResult FooAsync();
}

public interface IBarService : IService<IBarService>, IFooService
{
    UnaryResult BarAsync();
}
The generated code is as follows:
// <auto-generated />
#pragma warning disable

namespace Sample
{
    partial class MagicOnionClientInitializer
    {
        static partial class MagicOnionGeneratedClient
        {
            [global::MagicOnion.Ignore]
            public class Sample_Shared_BarServiceClient : global::MagicOnion.Client.MagicOnionClientBase<global::Sample.Shared.Services.IBarService>, global::Sample.Shared.Services.IBarService
            {
                class ClientCore
                {
                    public global::MagicOnion.Client.Internal.RawMethodInvoker<global::MessagePack.Nil, global::MessagePack.Nil> BarAsync;
                    public ClientCore(global::MagicOnion.Serialization.IMagicOnionSerializerProvider serializerProvider)
                    {
                        this.BarAsync = global::MagicOnion.Client.Internal.RawMethodInvoker.Create_ValueType_ValueType<global::MessagePack.Nil, global::MessagePack.Nil>(global::Grpc.Core.MethodType.Unary, "IBarService", "BarAsync", serializerProvider);
                    }
                 }

                readonly ClientCore core;

                public Sample_Shared_BarServiceClient(global::MagicOnion.Client.MagicOnionClientOptions options, global::MagicOnion.Serialization.IMagicOnionSerializerProvider serializerProvider) : base(options)
                {
                    this.core = new ClientCore(serializerProvider);
                }

                private Sample_Shared_BarServiceClient(global::MagicOnion.Client.MagicOnionClientOptions options, ClientCore core) : base(options)
                {
                    this.core = core;
                }

                protected override global::MagicOnion.Client.MagicOnionClientBase<global::Sample.Shared.Services.IBarService> Clone(global::MagicOnion.Client.MagicOnionClientOptions options)
                    => new Sample_Shared_BarServiceClient(options, core);

                public global::MagicOnion.UnaryResult<global::MessagePack.Nil> BarAsync()
                    => this.core.BarAsync.InvokeUnary(this, "IBarService/BarAsync", global::MessagePack.Nil.Default);
            }
        }
    }
}
The expected code is as follows:
// <auto-generated />
#pragma warning disable

namespace Sample
{
    partial class MagicOnionClientInitializer
    {
        static partial class MagicOnionGeneratedClient
        {
            [global::MagicOnion.Ignore]
            public class Sample_Shared_BarServiceClient : global::MagicOnion.Client.MagicOnionClientBase<global::Sample.Shared.Services.IBarService>, global::Sample.Shared.Services.IBarService
            {
                class ClientCore
                {
                    public global::MagicOnion.Client.Internal.RawMethodInvoker<global::MessagePack.Nil, global::MessagePack.Nil> FooAsync;
                    public global::MagicOnion.Client.Internal.RawMethodInvoker<global::MessagePack.Nil, global::MessagePack.Nil> BarAsync;
                    public ClientCore(global::MagicOnion.Serialization.IMagicOnionSerializerProvider serializerProvider)
                    {
                        this.FooAsync = global::MagicOnion.Client.Internal.RawMethodInvoker.Create_ValueType_ValueType<global::MessagePack.Nil, global::MessagePack.Nil>(global::Grpc.Core.MethodType.Unary, "IBarService", "FooAsync", serializerProvider);
                        this.BarAsync = global::MagicOnion.Client.Internal.RawMethodInvoker.Create_ValueType_ValueType<global::MessagePack.Nil, global::MessagePack.Nil>(global::Grpc.Core.MethodType.Unary, "IBarService", "BarAsync", serializerProvider);
                    }
                 }

                readonly ClientCore core;

                public Sample_Shared_BarServiceClient(global::MagicOnion.Client.MagicOnionClientOptions options, global::MagicOnion.Serialization.IMagicOnionSerializerProvider serializerProvider) : base(options)
                {
                    this.core = new ClientCore(serializerProvider);
                }

                private Sample_Shared_BarServiceClient(global::MagicOnion.Client.MagicOnionClientOptions options, ClientCore core) : base(options)
                {
                    this.core = core;
                }

                protected override global::MagicOnion.Client.MagicOnionClientBase<global::Sample.Shared.Services.IBarService> Clone(global::MagicOnion.Client.MagicOnionClientOptions options)
                    => new Sample_Shared_BarServiceClient(options, core);

                public global::MagicOnion.UnaryResult<global::MessagePack.Nil> FooAsync()
                    => this.core.FooAsync.InvokeUnary(this, "IBarService/FooAsync", global::MessagePack.Nil.Default);
                public global::MagicOnion.UnaryResult<global::MessagePack.Nil> BarAsync()
                    => this.core.BarAsync.InvokeUnary(this, "IBarService/BarAsync", global::MessagePack.Nil.Default);
            }
        }
    }
}

monry avatar Mar 19 '25 13:03 monry