【问题标题】:how to implement autofac dependency injection with parameter in constructor or with any condition?如何使用构造函数中的参数或任何条件实现autofac依赖注入?
【发布时间】:2016-11-16 17:08:29
【问题描述】:

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

Customer.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 库尝试了这个 - 我想知道它总是最后注入的类对象,如何使用构造函数或任何条件设置解析对象?

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

【问题讨论】:

  • 你可以使用names,即builder.Register&lt;OracleData&gt;().Named&lt;Idata&gt;("oracleData");scope.ResolveNamed&lt;Idata&gt;("oracleData");
  • 哦,我明白了,但是我们如何在构造函数中使用它或使用任何条件?
  • 在链接的文章中,public DataHandler([WithKey("oracleData")] Idata data) { ... }
  • “在使用任何依赖注入之前,我使用简单的接口来制作如下所示的松散耦合代码”。您的示例清楚地显示了依赖注入,因此您之前使用的是依赖注入,而不是 IoC 容器,它是应用 DI 时的可选工具。

标签: c# dependency-injection inversion-of-control autofac ioc-container


【解决方案1】:

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

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

【讨论】:

  • 但我想我们必须正确注册所有类而不考虑条件,我们需要使用条件或构造函数来解决它?
  • 可以直接做 IData app = scope.Resolve();如果您需要稍后再决定。
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多