如何在 ASP.NET Core 中实现 IOrganizationService?

问题描述 投票:0回答:1

我有一个 .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>();

但是我不知道如何为此编写接口和服务类以及如何添加连接字符串。

asp.net-core .net-core dynamics-crm dataverse
1个回答
0
投票

您可以尝试使用下面的代码来创建

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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.