Service Fabric is a great tool for implementing Microservices pattern and ASP.NET MVC is a great framework for websites. How to connect these two? There are different ways you can remotely call a service from Service Fabric. In this blog, I’ll explore one of them.
This blog is using the sample that is covered in my other blog:Is Service Fabric slow for development? There’s a way to make it faster.
The full code for it is in this Git repository: https://github.com/tachev/ServiceFabricStandalone.git
To expose the service is pretty easy. All you need is to add a reference to these packages and to override one method:
<package id="Microsoft.ServiceFabric.Services.Remoting" version="2.8.211" targetFramework="net461" /> <package id="Microsoft.ServiceFabric.FabricTransport.Internal" version="2.8.211" targetFramework="net461" />
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { new ServiceReplicaListener(context => this.CreateServiceRemotingListener(context)) }; }
In the website project there is a little bit more setup, but after that, it’s pretty simple.
- Add helper classes for MVC
- UsersStateServiceExtensions – This class is used to simplify adding the service in the Startup class. All you need is adding this code to the ConfigureServices method:
services.AddUsersService();
public static class UsersStateServiceExtensions { public static IServiceCollection AddUsersStateService(this IServiceCollection services) { if (services == null) { throw new ArgumentNullException(nameof(services)); } #if STANDALONE //Register standalone services Microsoft.ServiceFabric.Services.Runtime.ServiceRuntime.RegisterServiceAsync("UsersStateServiceType", context => new UsersStateService.UsersStateService(context)).GetAwaiter().GetResult(); #endif return services.AddSingleton<IUsersStateService, ServiceFabricUsersStateService>(); } }
- ServiceFabricUsersStateService – This class implements the proxy pattern, and it ensures creating a new service instance per each request.
- UsersStateServiceExtensions – This class is used to simplify adding the service in the Startup class. All you need is adding this code to the ConfigureServices method:
- Update the Controllers
- Use dependency injection to get a reference to the UsersStateService:
private readonly IUsersStateService userStateService; public HomeController(IUsersStateService userStateService) { this.userStateService = userStateService; }
- Send the current state to the view and update the state:
public async Task<IActionResult> Index() { ViewData["State"] = await userStateService.GetUserStateAsync(); await userStateService.SetUserStateAsync("Last visited page was Index"); return View(); }
- Update the views to show the state:
<p>State: @ViewData["State"] </p>
- Use dependency injection to get a reference to the UsersStateService:
Let me know if you have any questions or comments on how I can improve the blog and/or the source code.
Thanks,
George