gpt4 book ai didi

c# - 如何构造函数注入(inject)仅在运行时已知的字符串? (温莎城堡)

转载 作者:太空狗 更新时间:2023-10-30 01:03:37 25 4
gpt4 key购买 nike

我有一个依赖于字符串的类:

public class Person
{
private readonly string _name;

public Person(string name)
{
if (name == null) throw new ArgumentNullException("name");
_name = name;
}
}

此字符串“名称”仅在运行时已知,例如。它在配置中定义。所以我有这个提供这个字符串的接口(interface):

public interface IConfiguration
{
string Name { get; }
}

两种类型,Person 和 IConfiguration(及其实现在这里并不重要)都在 Windsor 容器中注册。

问题:如何告诉 WindsorCaSTLe 容器它应该将 IConfiguration 的 Name 属性注入(inject)到 Person 类的构造函数中?

警告:我不想将 IConfiguration 注入(inject) Person 类或使用类型工厂...Person 类必须简单并且只接受字符串作为参数。

最佳答案

可能有更多方法可以做到这一点,因为 Windsor 非常灵活,但这里有三种方法:

选项 1:

如果 IConfiguration 是一个单例或以某种方式可以在没有任何其他帮助的情况下填充 Name,您可以执行以下操作:

container.Register(Component.For<IConfiguration>().ImplementedBy<Configuration>());
container.Register(Component
.For<Person>()
.DynamicParameters((DynamicParametersDelegate)ResolvePersonName));

// This should be a private method in your bootstrapper
void ResolvePersonName(IKernel kernel, IDictionary parameters)
{
parameters["name"] = kernel.Resolve<IConfiguration>().Name;
}

此方法在解析 Person 之前调用,并将 name 键/值对设置为所需的值。 Windsor 然后使用这个字典来覆盖构造函数中的任何依赖项。为了更简洁,我可能只是将其设为 lambda:

    .DynamicParameters((k,p) => p["name"] = k.Resolve<IConfiguration>().Name));

选项 2:

如果 Name 值实际上在应用程序设置文件中定义,Windsor 有一个内置选项:

container.Register(
Component.For<Person>()
.DependsOn(Dependency.OnAppSettingsValue("name", "configSettingKeyName")));

选项 3:

你说你不想使用 Typed Factories ,但我认为这是使用一个的合理情况。它根本不会使 Person 类复杂化,但会在创建 Person 对象(人?)的代码中添加一些内容。这是一个例子:

定义工厂接口(interface):

public interface IPersonFactory
{
Person Create(string name);
}

然后在创建Person 的地方,注入(inject)工厂并改用它:

public class PersonUser
{
public Personuser(IConfiguration configuration, IPersonFactory personFactory)
{
Person person = personFactory.Create(configuration.Name);
}
}

您必须添加设施并注册接口(interface),但这很简单:

container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<IPersonFactory>().AsFactory());

关于c# - 如何构造函数注入(inject)仅在运行时已知的字符串? (温莎城堡),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27507396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com