我有一个 .NET 7 ASP.NET Core 项目,用于连接到 Dynamics 365/Dataverse。
到目前为止我没有使用任何服务或接口。在每个控制器中,我使用 Microsoft.PowerPlatform.Dataverse.Client 创建 ServiceClient 的新实例。例如:
public class ContactsController : Controller
{
private readonly IConfiguration _configuration;
public ContactsController(IConfiguration configuration)
{
_configuration = configuration;
}
[Authorize]
public IActionResult Index()
{
string? connectionString = _configuration.GetConnectionString("Dataverse");
//var svv = _orgService(connectionString);
using (ServiceClient svc = new ServiceClient(connectionString))
{
if (svc.IsReady)
{
//Get data from Dataverse using svc
return View();
}
return View();
}
}
}
但是,我知道这种做法不好。我不会重复使用 ServiceClient 并为每个控制器中的每个调用创建新的 ServiceClient。我知道我应该在 Program.cs 中注册 ServiceClient 和 IOrganizationService,例如:
builder.Services.AddScoped<IOrganizationService, ServiceClient>();
但是我不知道如何为此编写接口和服务类以及如何添加连接字符串。
您可以尝试使用下面的代码来创建
ServiceClient
并抽象出控制器中 ServiceClient
的直接使用。
IOrganizationServiceWrapper.cs:
public interface IOrganizationServiceWrapper
{
bool IsReady { get; }
.......
.......
}
组织服务包装器.cs:
public class OrganizationServiceWrapper : IOrganizationServiceWrapper
{
private readonly ServiceClient _serviceClient;
public OrganizationServiceWrapper(string connectionString)
{
_serviceClient = new ServiceClient(connectionString);
}
public bool IsReady => _serviceClient.IsReady;
...
...
}
程序.cs:
builder.Services.AddScoped<IOrganizationServiceWrapper>(sp =>
{
var configuration = sp.GetRequiredService<IConfiguration>();
var connectionString = configuration.GetConnectionString("Dataverse");
return new OrganizationServiceWrapper(connectionString);
});
ContactsController.cs:
public class ContactsController : Controller
{
private readonly IOrganizationServiceWrapper _orgService;
public ContactsController(IOrganizationServiceWrapper orgService)
{
_orgService = orgService;
}
[Authorize]
public IActionResult Index()
{
if (_orgService.IsReady)
{
return View();
}
return View();
}
}