问题是使用 Ioc 容器变得非常复杂,因为名称等字符串对象不容易注册,使用 Ioc 容器变得复杂
大多数优秀的 IoC 容器将在您进行配置时提供简单的方法来提供构造函数参数。
您的第一个示例——构造函数注入——通常被认为是首选方式。将您的构造函数视为要遵循的契约,一旦满足,它就会呈现一个有效的对象。
您的第二个代码示例——属性注入——通常被认为不如构造函数注入好。不管怎样,IoC 容器通常会让您能够在配置时为构造函数参数或属性提供值,每次您要求 IoC 创建该对象时都会提供这些值。
我不确定您要使用哪个 IoC 容器,但这里有一个用于配置 StructureMap 并为各种服务提供字符串值的代码示例。除非我误读了您的问题,否则这似乎就是您想要做的。
ObjectFactory.Initialize(x =>
{
x.For<ICatalogAdminService>().Use<DLinkCatalogAdminService>()
.Ctor<string>("catalogConnectionString").Is(ConfigurationManager.ConnectionStrings["myCompany_AdminConnectionString"].ConnectionString)
.Ctor<string>("contentConnectionString").Is(ConfigurationManager.ConnectionStrings["myCompany_AdminConnectionString"].ConnectionString)
.Ctor<string>("webCatalogConnectionString").Is(ConfigurationManager.ConnectionStrings["myCompany_WebConnectionString"].ConnectionString)
.Ctor<string>("dlinkPromotionAdminConnectionString").Is(ConfigurationManager.ConnectionStrings["myCompany_AdminConnectionString"].ConnectionString);
x.For<IContentManagementAdminService>().Use<DLinkContentManagementAdminService>()
.Ctor<string>("contentConnectionString").Is(ConfigurationManager.ConnectionStrings["myCompany_AdminConnectionString"].ConnectionString)
.Ctor<string>("webCatalogConnectionString").Is(ConfigurationManager.ConnectionStrings["myCompany_WebConnectionString"].ConnectionString)
.Ctor<string>("dlinkPromotionConnectionString").Is(ConfigurationManager.ConnectionStrings["myCompany_AdminConnectionString"].ConnectionString);
x.For<IPromotionAdminService>().Use<DLinkPromotionAdminService>()
.Ctor<string>("catalogConnectionString").Is(ConfigurationManager.ConnectionStrings["myCompany_AdminConnectionString"].ConnectionString)
.Ctor<string>("promotionConnectionString").Is(ConfigurationManager.ConnectionStrings["myCompany_AdminConnectionString"].ConnectionString);
x.For<ISearchService>().Use<Extractor>();
x.For<IImporter>().Use<Importer>();
x.For<IOrderAdminService>().Use<DLinkOrderAdminService>()
.Ctor<string>("contentConnectionString").Is(ConfigurationManager.ConnectionStrings["myCompany_AdminConnectionString"].ConnectionString)
.Ctor<string>("orderConnectionString").Is(ConfigurationManager.ConnectionStrings["myCompany_OrdersConnectionString"].ConnectionString);
});
编辑
回答评论,如果你想手动提供一个构造函数参数,它看起来像这样:
ObjectFactory.GetInstance<ICatalogAdminService>(new ExplicitArguments(
new Dictionary<string, object>() { { "parameter1", "someValue" } }));
显然这会很快变得丑陋,所以如果你发现自己经常这样做,你可能想要启动一些工厂/辅助方法。