You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET Core 7中实现IOrganizationService依赖注入

解决方案步骤

1. 配置Dataverse连接字符串

在appsettings.json中添加Dataverse的连接字符串(根据你的认证方式调整格式,示例为ClientSecret认证):

{
  "ConnectionStrings": {
    "Dataverse": "AuthType=ClientSecret;Url=https://your-org.crm.dynamics.com;ClientId=your-client-id;ClientSecret=your-client-secret;"
  }
}

2. 在Program.cs中注册服务

ServiceClient本身已经实现了IOrganizationService接口,我们通过DI容器的工厂方法创建实例,确保每个HTTP请求复用同一个实例(Scoped生命周期):

builder.Services.AddScoped<IOrganizationService>(provider =>
{
    var configuration = provider.GetRequiredService<IConfiguration>();
    var connectionString = configuration.GetConnectionString("Dataverse");
    
    var serviceClient = new ServiceClient(connectionString);
    
    // 初始化验证,避免无效连接流入业务逻辑
    if (!serviceClient.IsReady)
    {
        throw new InvalidOperationException("无法连接到Dataverse,请检查连接字符串配置");
    }
    
    return serviceClient;
});

Scoped生命周期会在单个请求范围内复用ServiceClient,避免重复创建实例带来的性能开销

3. (可选)创建封装服务类(推荐)

如果需要将Dataverse操作逻辑与控制器解耦,可自定义业务服务:

定义业务接口

public interface IDataverseContactService
{
    Task<IEnumerable<Entity>> GetContactsAsync();
    // 可添加更多业务方法,比如创建、更新联系人等
}

实现业务服务

public class DataverseContactService : IDataverseContactService
{
    private readonly IOrganizationService _orgService;

    public DataverseContactService(IOrganizationService orgService)
    {
        _orgService = orgService;
    }

    public async Task<IEnumerable<Entity>> GetContactsAsync()
    {
        var query = new QueryExpression("contact")
        {
            ColumnSet = new ColumnSet("fullname", "emailaddress1")
        };
        
        var result = await _orgService.RetrieveMultipleAsync(query);
        return result.Entities;
    }
}

注册封装服务

在Program.cs中追加注册:

builder.Services.AddScoped<IDataverseContactService, DataverseContactService>();

4. 在控制器中注入使用

方式1:直接注入IOrganizationService

public class ContactsController : Controller
{
    private readonly IOrganizationService _orgService;

    public ContactsController(IOrganizationService orgService)
    {
        _orgService = orgService;
    }

    [Authorize]
    public async Task<IActionResult> Index()
    {
        var query = new QueryExpression("contact")
        {
            ColumnSet = new ColumnSet("fullname", "emailaddress1")
        };
        
        var contacts = await _orgService.RetrieveMultipleAsync(query);
        return View(contacts.Entities);
    }
}

方式2:注入自定义封装服务

public class ContactsController : Controller
{
    private readonly IDataverseContactService _contactService;

    public ContactsController(IDataverseContactService contactService)
    {
        _contactService = contactService;
    }

    [Authorize]
    public async Task<IActionResult> Index()
    {
        var contacts = await _contactService.GetContactsAsync();
        return View(contacts);
    }
}

内容的提问来源于stack exchange,提问作者Poja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:00:02