繁体   English   中英

如何使用构造函数中的参数或任何条件实现autofac依赖注入?

[英]how to implement autofac dependency injection with parameter in constructor or with any condition?

Before using any dependency injection我将使用简单的interface制作一个loosely coupled code如下所示:

Program.cs

class Program
    {
        static void Main(string[] args)
        {
            Customer obj = new Customer(new OracleData());
            obj.Add();
        }
    }

客户.cs

 public class Customer
    {
        private Idata iobj;
        public Customer(Idata newiobj)
        {
            iobj = newiobj;
        }
        public void Add()
        {
            iobj.AddData();
        }
    }

OracleData.cs

 public class OracleData : Idata
    {
        public void AddData()
        {
            throw new NotImplementedException();
        }
    }

SQLData.cs

public class SQLData : Idata
{
    public void AddData()
    {
        throw new NotImplementedException();
    }
}

idata.cs

 public interface Idata
    {
        void AddData();
    }

现在,我使用Autofac DI库进行了尝试-我想知道它始终是最后注入的类对象,如何使用构造函数或任何条件设置resolve对象?

Autofac DI编写代码-

static void Main(string[] args)
        {

            var builder = new ContainerBuilder();
            builder.RegisterType<Customer>();
            builder.RegisterType<OracleData>().As<Idata>();
            builder.RegisterType<SQLData>().As<Idata>();
            var container = builder.Build();
            using (var scope = container.BeginLifetimeScope())
            {
                var app = scope.Resolve<Idata>();
                app.AddData();
            }

            //commented
            //Customer obj = new Customer(new OracleData());
            //obj.Add();
        }

如果需要定义在入口点将使用的实现,则可以执行以下操作:

    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<Customer>();

        if(args[0] == "oracle")
            builder.RegisterType<OracleData>().As<Idata>();
        else
            builder.RegisterType<SQLData>().As<Idata>();

        var container = builder.Build();

        using (var scope = container.BeginLifetimeScope())
        {
            var app = scope.Resolve<Idata>();
            app.AddData();
        }

        //commented
        //Customer obj = new Customer(new OracleData());
        //obj.Add();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM