摆脱静态类中的依赖关系

本文关键字:依赖 关系 静态类 | 更新日期: 2023-09-27 18:15:31

为了使用autofacc,我需要重构一个项目。但是我正在努力尝试在一个服务(CrmCustomerService)中使用它,它有一个这样的构造函数:

//...
private readonly CrmService _service;
//...
public CrmCustomerService()
{
    _service = InstantiateCrmIntegrationWebServices();
}
public static CrmService InstantiateCrmIntegrationWebServices()
{
    var service = new CrmService();
    if (!string.IsNullOrEmpty(ConfigParameter.GetS("webservices.url.CrmIntegrationWebService")))
    {
        service.Url = ConfigParameter.GetS("webservices.url.CrmIntegrationWebService");
    }
    var token = new CrmAuthenticationToken
    {
        AuthenticationType = 0, 
        OrganizationName = "Foo"
    };
    service.CrmAuthenticationTokenValue = token;
    service.Credentials = new NetworkCredential(ConfigParameter.GetS("crm.UserId"), ConfigParameter.GetS("crm.Password"), ConfigParameter.GetS("crm.Domain"));
    return service;
}

我如何在CrmCustomerService构造器中注入CrmService?如果我能告诉autofacc对这个依赖项使用这个方法,那就足够了,但我不确定我是否能做到这一点。

谢谢

摆脱静态类中的依赖关系

Autofac可以接受委托或lambda表达式作为组件创建器。这将允许您在注册CrmService服务的lambda表达式中封装CrmService的创建。

使用以下切割CrmService类型和相关提取接口:

public interface ICrmService
{
    string Url { get; set; }
}
public class CrmService : ICrmService
{
    public string Url { get; set; }
}

然后在构建器配置中按如下方式注册ICrmService服务:

builder.Register<ICrmService>(x =>
{
    var service = new CrmService
    {
        Url = "Get url from config"               
    };
    return service;
});

然后正常注射到你的CrmCustomerService类型。

或者,如果您不想为CrmService提取接口,只需执行以下操作:

builder.Register<CrmService>(x =>
{
    var service = new CrmService
    {
        Url = "Get url from config"               
    };
    return service;
});