【问题标题】:Autofac WCF injection on reflectionAutofac WCF注入反射
【发布时间】:2017-08-17 22:04:35
【问题描述】:

我的应用程序上有 N 个验证器,但客户端没有使用所有验证器,我通过过程获得了当前客户端需要实例化的所有类。

我的业务层:

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);
    }
}

在 Global 上,我可以注册所有验证器并使用 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>>();
    }
}

我的问题是如何检测接口INameDBINameDB2,在Autofac 上获取实例并在Activator.CreateInstance 上使用?

谢谢。

【问题讨论】:

    标签: c# asp.net wcf reflection autofac


    【解决方案1】:

    几天后,我可以编写解决方案:

    我的主类,我创建了一个注入验证器列表的方法:

    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&lt;INameDB2&gt;(); 获取容器上的接口数据库实例:

    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);
        }
    }
    

    在 Global 上,我做了一种不需要添加行来注册 IValidator 实现的新类的方法:

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多