2017-05-09 6 views
0

複数のルール呼び出しを処理できる単一のルールがあるため、ルールクラスに配置されたカスタム属性が作成されています。この属性は、処理が許可されている名前をリストします。構造マップでは、私はカスタム属性を読むことによって複数の名前と同じルールを登録したいと思います。名前リストを使用して複数のインスタンスをカスタム属性に登録する

[RuleIdentifer(new string[] { "RunAction1","RunAction2","RunAction3" })] 

私はMissingNamedInstanceIsクラスを使用しようとしましたが、双方向依存性エラーが発生しました。

_.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); 

答えて

0

場合は先に、私自身が作成しました登録規約。今すぐ期待どおりに作業してください。

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; 
       } 
      }); 
     } 
    } 
関連する問題