Как вызвать метод зерна Орлеана без ссылки на реализацию зерна?

Как вызвать метод зерна Орлеана без ссылки на реализацию зерна?

  • Зерновой клиент — приложение .Net Core.
  • Класс реализации Grain — классическая библиотека .Net Framework, и его нельзя добавить в приложение .Net Core.

person Serj-Tm    schedule 04.06.2018    source источник
comment
Добавление интерфейсов зерна в проект Core, ссылка на него из реализации Framework и клиент Core не работает?   -  person lmagyar    schedule 05.06.2018
comment
@lmagyar Не работать с ошибкой: не удается найти класс реализации для интерфейса зерна: IBlaBla. Убедитесь, что сборка зерна правильно развернута и загружена в силос. И написана документация: добавить ссылки на интерфейс и реализацию в клиентский код.   -  person Serj-Tm    schedule 06.06.2018
comment
Возможно, вы что-то упустили, например. ссылаясь на базовый класс Grain из реализации, это может вызвать подобные ошибки, потому что да, для интерфейса нет реализации (реализация наследует интерфейс И базовый класс Grain). Смотрите мой ответ ниже.   -  person lmagyar    schedule 06.06.2018
comment
@Спасибо за пример проекта. Я пропускаю ссылку на Microsoft.Orleans.OrleansCodeGenerator.Build   -  person Serj-Tm    schedule 11.06.2018


Ответы (2)


Из проекта клиента ссылка только на проект интерфейса (Core -> Standard).

Из основного проекта ссылайтесь на проект реализации (Полный -> Полный), а проект реализации ссылается на проект интерфейса (Полный -> Стандартный).

Это прекрасно работает, см.: https://github.com/lmagyar/SO_Question_50689964.

person lmagyar    schedule 06.06.2018

Минимальный образец Орлеана

Сервер

Консольное приложение .Net Framework

Install-Package Microsoft.Orleans.Core.Abstractions
Install-Package Microsoft.Orleans.OrleansCodeGenerator.Build
Install-Package Microsoft.Orleans.Server

class Program
{
    static async Task Main(string[] args)
    {
        await StartSilo();
    }
    static async Task StartSilo()
    {
        using (var host = new SiloHostBuilder()
            .UseLocalhostClustering()
            //.ConfigureLogging(logging => logging.AddConsole())
            .ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(SampleGrain).Assembly).WithReferences())
            .Build())
        {
            await host.StartAsync();

            Console.WriteLine("Silo started. Press any key to terminate...");
            Console.ReadKey();
        }
    }


}

public class SampleGrain : Grain, ISample
{
    public Task<string> Ping(string message)
    {
        Console.WriteLine($"Pinged with '{message}'");
        return Task.FromResult($"Message '{message}' received");
    }
}

Интерфейсы

Стандартная библиотека классов .Net

Install-Package Microsoft.Orleans.Core.Abstractions

public interface ISample : IGrainWithStringKey
{
    Task<string> Ping(string message);
}

Клиент

Консольное приложение .Net Core

Install-Package Microsoft.Orleans.OrleansCodeGenerator.Build
Install-Package Microsoft.Orleans.Client

static async Task Main(string[] args)
{
    await PingSample();
}

static async Task PingSample()
{
    using (var client = new ClientBuilder()
        .UseLocalhostClustering()
        //.ConfigureLogging(logging => logging.AddConsole())
        .ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(ISample).Assembly).WithReferences())
        .Build())
    {
        await client.Connect();
        Console.WriteLine("Client successfully connected to silo host.");

        var sample = client.GetGrain<ISample>("one");

        var result = await sample.Ping("hello");
        Console.WriteLine(result);
    }

}

https://github.com/Serj-Tm/Orleans.MinimalSample

person Serj-Tm    schedule 28.06.2018