使用名称列表根据自定义属性注册多个实例
Register multiple instance based off of custom attribute with name list
我有一个可以处理多个规则调用的规则,因此我创建了一个放置在规则 class 上的自定义属性。该属性列出了允许它处理的名称。在 structuremap 中,我想通过读取自定义属性将相同的规则注册为多个名称。
[RuleIdentifer(new string[] { "RunAction1","RunAction2","RunAction3" })]
我尝试使用 MissingNamedInstanceIs class 但 运行 进入双向依赖错误。 Scan后在容器的创建中已经放置了以下内容:
_.For<Rules.IRule>().MissingNamedInstanceIs.ConstructedBy("Pull Rule by Name from Attribute",r =>
{
return r.GetAllInstances<Rules.IRule>().FirstOrDefault<Rules.IRule>(r1 =>
{
var dnAttribute = r1.GetType().GetCustomAttributes(typeof(RuleIdentifer), true).FirstOrDefault() as RuleIdentifer;
if (dnAttribute != null && dnAttribute.Names.Contains<string>(r.RequestedName)) return true;
return true;
});
});
在扫描部分NameBy调用中有没有更好的方法来做到这一点:
x.AddAllTypesOf<Rules.IRule>().NameBy(t => t.Name);
提前创建了我自己的 RegistrationConvention。现在按预期工作。
public class RuleAttributeConvention : IRegistrationConvention
{
public void ScanTypes(TypeSet types, Registry registry)
{
// Only work on concrete types
types.FindTypes(TypeClassification.Concretes | TypeClassification.Closed).Where(typ => typeof(Rules.IRule).IsAssignableFrom(typ)).ToList().ForEach(t =>
{
var dnAttribute = t.GetCustomAttributes(typeof(RuleIdentifer), true).FirstOrDefault() as RuleIdentifer;
if (null == dnAttribute) return;
foreach (var nm in dnAttribute.Names)
{
registry.For<Rules.IRule>().Use(t.Name).Name = nm;
}
});
}
}
我有一个可以处理多个规则调用的规则,因此我创建了一个放置在规则 class 上的自定义属性。该属性列出了允许它处理的名称。在 structuremap 中,我想通过读取自定义属性将相同的规则注册为多个名称。
[RuleIdentifer(new string[] { "RunAction1","RunAction2","RunAction3" })]
我尝试使用 MissingNamedInstanceIs class 但 运行 进入双向依赖错误。 Scan后在容器的创建中已经放置了以下内容:
_.For<Rules.IRule>().MissingNamedInstanceIs.ConstructedBy("Pull Rule by Name from Attribute",r =>
{
return r.GetAllInstances<Rules.IRule>().FirstOrDefault<Rules.IRule>(r1 =>
{
var dnAttribute = r1.GetType().GetCustomAttributes(typeof(RuleIdentifer), true).FirstOrDefault() as RuleIdentifer;
if (dnAttribute != null && dnAttribute.Names.Contains<string>(r.RequestedName)) return true;
return true;
});
});
在扫描部分NameBy调用中有没有更好的方法来做到这一点:
x.AddAllTypesOf<Rules.IRule>().NameBy(t => t.Name);
提前创建了我自己的 RegistrationConvention。现在按预期工作。
public class RuleAttributeConvention : IRegistrationConvention
{
public void ScanTypes(TypeSet types, Registry registry)
{
// Only work on concrete types
types.FindTypes(TypeClassification.Concretes | TypeClassification.Closed).Where(typ => typeof(Rules.IRule).IsAssignableFrom(typ)).ToList().ForEach(t =>
{
var dnAttribute = t.GetCustomAttributes(typeof(RuleIdentifer), true).FirstOrDefault() as RuleIdentifer;
if (null == dnAttribute) return;
foreach (var nm in dnAttribute.Names)
{
registry.For<Rules.IRule>().Use(t.Name).Name = nm;
}
});
}
}