如何在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
相关产品推荐
相关产品推荐

