是否存在为使用" x"命名的构造函数参数指定值的约定。例如,执行以下操作
对于任何请求的依赖项,具有名为" pathToFile"的构造函数参数; ,提供这个价值。
我可以使用For
语法并使用ctor
执行此操作,但无法为我想要配置的每个类编写相同的代码段。
public class FileManager(string pathToFile):IDocumentManager
{
}
当我请求IDocumentManager(依赖)时,它(实例)有一个名为pathToFile
的参数的构造函数,所以我希望它注入一些值
答案 0 :(得分:1)
可以创建自定义约定。通过实施IRegistrationConvention
创建约定。然后在Process
方法中检查类型是否为具体类型,检查它是否具有所需的构造函数参数,然后为其实现的所有接口注册构造函数的参数,并键入自身。我正在使用这种约定来注入连接字符串。
public class ConnectionStringConvention : IRegistrationConvention
{
public void Process(Type type, Registry registry)
{
if (!type.IsConcrete() || type.IsGenericType) return;
if (!HasConnectionString(type)) return;
type.GetInterfaces().Each(@interface =>
{
registry.For(@interface)
.Use(type)
.WithProperty("connectionString")
.EqualTo(SiteConfiguration.AppConnectionString);
});
registry.For(type)
.Use(type)
.WithProperty("connectionString")
.EqualTo(SiteConfiguration.AppConnectionString);
}
private bool HasConnectionString(Type type)
{
return type.GetConstructors()
.Any(c => c.GetParameters()
.Any(p => p.Name == "connectionString"));
}
}
创建约定后,将其注册到容器配置中:
Scan(x =>
{
x.TheCallingAssembly();
x.WithDefaultConventions();
x.Convention<ConnectionStringConvention>();
});
有关详细信息,请查看:
http://structuremap.github.io/registration/auto-registration-and-conventions/