때 앞서 내 자신을 만들어 : 전화 NameBy
_.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;
});
});
이 있는가 검사 섹션에서이 작업을 수행 할 수있는 더 좋은 방법 : 다음은 스캔 후 용기의 창조에 배치되었습니다 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;
}
});
}
}