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

C# 如何使用构造函数中的参数或任何条件实现autofac依赖项注入?,c#,dependency-injection,inversion-of-control,autofac,ioc-container,C#,Dependency Injection,Inversion Of Control,Autofac,Ioc Container,在使用依赖项注入之前我正在使用简单的接口来创建一个松散耦合的代码,如下所示- Program.cs class Program { static void Main(string[] args) { Customer obj = new Customer(new OracleData()); obj.Add(); } } public class Customer {

在使用依赖项注入之前
我正在使用简单的
接口
来创建一个
松散耦合的代码
,如下所示-

Program.cs

class Program
    {
        static void Main(string[] args)
        {
            Customer obj = new Customer(new OracleData());
            obj.Add();
        }
    }
 public class Customer
    {
        private Idata iobj;
        public Customer(Idata newiobj)
        {
            iobj = newiobj;
        }
        public void Add()
        {
            iobj.AddData();
        }
    }
 public class OracleData : Idata
    {
        public void AddData()
        {
            throw new NotImplementedException();
        }
    }
public class SQLData : Idata
{
    public void AddData()
    {
        throw new NotImplementedException();
    }
}
 public interface Idata
    {
        void AddData();
    }
Customer.cs

class Program
    {
        static void Main(string[] args)
        {
            Customer obj = new Customer(new OracleData());
            obj.Add();
        }
    }
 public class Customer
    {
        private Idata iobj;
        public Customer(Idata newiobj)
        {
            iobj = newiobj;
        }
        public void Add()
        {
            iobj.AddData();
        }
    }
 public class OracleData : Idata
    {
        public void AddData()
        {
            throw new NotImplementedException();
        }
    }
public class SQLData : Idata
{
    public void AddData()
    {
        throw new NotImplementedException();
    }
}
 public interface Idata
    {
        void AddData();
    }
OracleData.cs

class Program
    {
        static void Main(string[] args)
        {
            Customer obj = new Customer(new OracleData());
            obj.Add();
        }
    }
 public class Customer
    {
        private Idata iobj;
        public Customer(Idata newiobj)
        {
            iobj = newiobj;
        }
        public void Add()
        {
            iobj.AddData();
        }
    }
 public class OracleData : Idata
    {
        public void AddData()
        {
            throw new NotImplementedException();
        }
    }
public class SQLData : Idata
{
    public void AddData()
    {
        throw new NotImplementedException();
    }
}
 public interface Idata
    {
        void AddData();
    }
SQLData.cs

class Program
    {
        static void Main(string[] args)
        {
            Customer obj = new Customer(new OracleData());
            obj.Add();
        }
    }
 public class Customer
    {
        private Idata iobj;
        public Customer(Idata newiobj)
        {
            iobj = newiobj;
        }
        public void Add()
        {
            iobj.AddData();
        }
    }
 public class OracleData : Idata
    {
        public void AddData()
        {
            throw new NotImplementedException();
        }
    }
public class SQLData : Idata
{
    public void AddData()
    {
        throw new NotImplementedException();
    }
}
 public interface Idata
    {
        void AddData();
    }
Idata.cs

class Program
    {
        static void Main(string[] args)
        {
            Customer obj = new Customer(new OracleData());
            obj.Add();
        }
    }
 public class Customer
    {
        private Idata iobj;
        public Customer(Idata newiobj)
        {
            iobj = newiobj;
        }
        public void Add()
        {
            iobj.AddData();
        }
    }
 public class OracleData : Idata
    {
        public void AddData()
        {
            throw new NotImplementedException();
        }
    }
public class SQLData : Idata
{
    public void AddData()
    {
        throw new NotImplementedException();
    }
}
 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(字符串[]args)
{
var builder=new ContainerBuilder();
RegisterType();
builder.RegisterType().As();
builder.RegisterType().As();
var container=builder.Build();
使用(var scope=container.BeginLifetimeScope())
{
var app=scope.Resolve();
app.AddData();
}
//评论
//客户obj=新客户(新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();
    }
static void Main(字符串[]args)
{
var builder=new ContainerBuilder();
RegisterType();
如果(参数[0]=“oracle”)
builder.RegisterType().As();
其他的
builder.RegisterType().As();
var container=builder.Build();
使用(var scope=container.BeginLifetimeScope())
{
var app=scope.Resolve();
app.AddData();
}
//评论
//客户obj=新客户(新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();
    }
static void Main(字符串[]args)
{
var builder=new ContainerBuilder();
RegisterType();
如果(参数[0]=“oracle”)
builder.RegisterType().As();
其他的
builder.RegisterType().As();
var container=builder.Build();
使用(var scope=container.BeginLifetimeScope())
{
var app=scope.Resolve();
app.AddData();
}
//评论
//客户obj=新客户(新OracleData());
//obj.Add();
}

您可以使用,即
builder.Register().Named(“oracleData”)
scope.ResolveNamed(“oracleData”)。哦,我明白了,但我们如何在构造函数内部使用它或使用任何条件呢?正如在链接文章中,
公共数据处理程序([WithKey(“oracleData”)]Idata数据){…}
“在使用依赖项注入之前,我正在使用简单的接口生成一个松散耦合的代码,如下所示”。您的示例清楚地显示了依赖项注入,因此您以前使用的是依赖项注入,而不是IoC容器,它是应用DI时的可选工具
scope.ResolveNamed(“oracleData”)。哦,我明白了,但我们如何在构造函数内部使用它或使用任何条件呢?正如在链接文章中,
公共数据处理程序([WithKey(“oracleData”)]Idata数据){…}
“在使用依赖项注入之前,我正在使用简单的接口生成一个松散耦合的代码,如下所示”。您的示例清楚地显示了依赖项注入,因此您以前使用的是依赖项注入,而不是IoC容器,它是应用DI时的可选工具。但是我想我们必须正确注册所有类,而不管条件如何,我们需要使用条件或构造函数解决它?您可以直接执行IData app=scope.resolve();如果你以后需要决定。但是我想不管条件如何,我们都必须正确注册所有类,我们需要使用条件或构造函数来解析它?你可以直接执行IData app=scope.resolve();如果你以后需要决定的话。