2017-08-17 9 views
0

私のアプリケーションにはN個のバリデータがありますが、クライアントはすべてのバリデータを使用しません。私は現在のクライアントがインスタンス化する必要があるすべてのクラスを手続きで取得しました。リフレクトでのAutofac WCF注入

マイビジネス層:

public class MyClass 
{ 
    public void MyMethod(int idClient) 
    { 
     //This array is returned by a procedure passing idClient 
     string[] validatorsName = { "ValidatorName", "ValidatorName2" }; 

     foreach (string name in validatorsName) 
     { 

      IValidator validator = (IValidator)Activator.CreateInstance(Type.GetType(name)); 
      //Error. I need pass the INameDB; 

      validator.Process(); 
     } 
    } 
} 

マイインタフェース:

public interface IValidator 
{ 
    void Process(); 
} 

バリ:グローバルで

public class ValidatorName : IValidator 
{ 
    INameDB nameDB; 

    public ValidatorName(INameDB nameDB) 
    { 
     this.nameDB = nameDB; 
    } 

    public void Process() 
    { 
     nameDB.AnyThing(pedidoId); 
    } 
} 

public class ValidatorName2 : IValidator 
{ 
    INameDB2 nameDB; 

    public ValidatorName(INameDB2 nameDB) 
    { 
     this.nameDB = nameDB; 
    } 

    public void Process() 
    { 
     nameDB.AnyThing2(pedidoId); 
    } 
} 

public class ValidatorName3 : IValidator 
{ 
    INameDB2 nameDB; 

    public ValidatorName(INameDB2 nameDB) 
    { 
     this.nameDB = nameDB; 
    } 

    public void Process() 
    { 
     nameDB.AnyThing2(pedidoId); 
    } 
} 

、私はすべてのバリデータを登録し、IList<IValidator>とができたので、私私が必要としないバリデータをリストから削除します。

string[] validatorsName = { "ValidatorName", "ValidatorName2" }; 
validators = validators .Where(p => validatorsName .Contains(p.GetType().Name)).ToList(); 

しかし、私は多くのクラスを持っていますが、これは不要です。

マイグローバル:

public class Global : System.Web.HttpApplication 
{ 

    protected void Application_Start(object sender, EventArgs e) 
    { 
     ContainerBuilder builder = new ContainerBuilder(); 
     builder.RegisterType<NameDB>().As<INameDB>(); 
     builder.RegisterType<NameDB2>().As<INameDB2>(); 

     //builder.RegisterType<ValidatorName1>().As<IValidator>(); 
     //builder.RegisterType<ValidatorName2>().As<IValidator>(); 
     //builder.RegisterType<ValidatorName3>().As<IValidator>(); 

     AutofacHostFactory.Container = builder.Build(); 
     //AutofacHostFactory.Container.Resolve<IList<IValidator>>(); 
    } 
} 

私の質問は、私はAutofac上のインスタンスを取得し、Activator.CreateInstanceに使用し、インターフェイスINameDBまたはINameDB2を検出することができる方法ですか?

ありがとうございました。

答えて

0

いくつかの日後、私は解決策をコーディングすることができが:

私のメインクラス、私は注入にバリデータリストメソッドを作成します。

public class MyClass 
{ 
    private IList<IValidator> listValidators; 

    public void MyMethod(int idClient) 
    { 
     ExecuteValidations(idClient); 
    } 

    private void ValidatorInjection(int idClient) 
    { 
     listValidators = new List<IValidator>(); 
     //This array is returned by a procedure passing idClient 
     string[] validatorsName = { "ValidatorName", "ValidatorName2" }; 
     foreach (string name in validatorsName) 
     { 
      IValidator validador = (IValidator)Activator.CreateInstance(Type.GetType(name)); 
      listValidators.Add(validador); 
     } 
    } 

    private void ExecuteValidations(int idClient) 
    { 
     ValidatorInjection(idClient); 
     RunValidatorsList(); 
    } 

    private void RunValidatorsList() 
    { 
     foreach (var validator in listValidators) 
     { 
      validator.Process(); 
     } 
    } 
} 

私のバリデータを、私は上のインターフェイスのデータベースインスタンスを取得する必要INameDB2 db = AutofacHostFactory.Container.Resolve<INameDB2>();とコンテナ:グローバルで

public class ValidatorName : IValidator 
{ 
    public void Process() 
    { 
     INameDB db = AutofacHostFactory.Container.Resolve<INameDB>(); 
     db.AnyThing(pedidoId); 
    } 
} 

public class ValidatorName2 : IValidator 
{ 
    public void Process() 
    { 
     INameDB2 db = AutofacHostFactory.Container.Resolve<INameDB2>(); 
     db.AnyThing2(pedidoId); 
    } 
} 

public class ValidatorName3 : IValidator 
{ 
    public void Process() 
    { 
     INameDB2 db = AutofacHostFactory.Container.Resolve<INameDB2>(); 
     db.AnyThing2(pedidoId); 
    } 
} 

、私はという新しいクラスを登録する行を追加する必要はありませんやり方をしました10実装:

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Start(object sender, EventArgs e) 
    { 
     ContainerBuilder builder = new ContainerBuilder(); 
     builder.RegisterType<NameDB>().As<INameDB>(); 
     builder.RegisterType<NameDB2>().As<INameDB2>(); 

     string assembly = "MY_ASSEMBLY"; 
     builder.RegisterAssemblyTypes(Assembly.Load(assembly)).Where(t => t.IsAssignableTo<IValidator>()).AsImplementedInterfaces(); 

     AutofacHostFactory.Container = builder.Build(); 
    } 
} 
関連する問題