摆脱静态类中的依赖关系
本文关键字:依赖 关系 静态类 | 更新日期: 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;
});