Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么依赖注入注入最后注册的对象?_C#_Dependency Injection_Unity Container - Fatal编程技术网

C# 为什么依赖注入注入最后注册的对象?

C# 为什么依赖注入注入最后注册的对象?,c#,dependency-injection,unity-container,C#,Dependency Injection,Unity Container,我需要你们的帮助。目前我正在控制台应用程序中进行依赖项注入。在单个类中,我定义了三个层来理解依赖注入。 事实上,我正在尝试注入数据访问层的对象,根据需求可以是Oracle或Sql。但是注入是根据最后注册的层进行的。有人能告诉我如何进行正确的注入吗 用户界面层: class Program { static void Main(string[] args) { IUnityContainer objconatiner = new UnityContainer();

我需要你们的帮助。目前我正在控制台应用程序中进行依赖项注入。在单个类中,我定义了三个层来理解依赖注入。 事实上,我正在尝试注入数据访问层的对象,根据需求可以是Oracle或Sql。但是注入是根据最后注册的层进行的。有人能告诉我如何进行正确的注入吗

用户界面层:

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer objconatiner = new UnityContainer();
        objconatiner.RegisterType<Customer>();
        objconatiner.RegisterType<IDal, SqlserverDal>();
        objconatiner.RegisterType<IDal, OracleServerDal>();

        Customer ocust = objconatiner.Resolve<Customer>();
        ocust.CustName = "Taylor Swift";
        ocust.Add();
   }
}
DAL层:

public interface IDal
{
    void Add();
}

public class SqlserverDal : IDal
{
    public void Add()
    {
        Console.Write("Now using Sql server");
    }
}

public class OracleServerDal : IDal
{
    public void Add()
    {
        Console.Write("Now using Orcale server");
    }
}

这正是命名注册发挥作用的地方

static void Main(string[] args)
{
    IUnityContainer objconatiner = new UnityContainer();
    objconatiner.RegisterType<Customer>();
    objconatiner.RegisterType<IDal, SqlserverDal>("SqlServer");
    objconatiner.RegisterType<IDal, OracleServerDal>("Oracle");

    Customer ocust = objconatiner.Resolve<Customer>();
    ocust.CustName = "Taylor Swift";
    ocust.Add();
}

public class Customer
{
    private IDal oidal;
    public string CustName { get; set; }

    public Customer([Dependency("SqlServer")]IDal idal)
    {
        oidal = idal;
    }

    public void Add()
    {
        oidal.Add();
    }
}
static void Main(字符串[]args)
{
IUnityContainer objconator=新的UnityContainer();
objconator.RegisterType();
RegisterType(“SqlServer”);
RegisterType(“Oracle”);
Customer ocust=objconator.Resolve();
ocust.CustName=“Taylor Swift”;
ocust.Add();
}
公共类客户
{
私营企业;
公共字符串CustName{get;set;}
公共客户([依赖关系(“SqlServer”)]IDal)
{
oidal=ideal;
}
公共无效添加()
{
3.Add();
}
}

现在两种注册都可以使用,但在解析时必须通过名称指定要进行的注册,这可以通过我上面所示的属性来完成,也可以通过接受字符串的
Resolve
调用来完成。

您希望容器如何知道要解析的注册?你不应该检查一些配置,只注册其中一个dal实现吗?但是如果我想调用一些新的dal层呢?这就是我要问的问题,我应该如何基于配置注入依赖关系。我需要将所有对象注册到我的unity容器中,所以我需要注册所有dal层。但是我应该如何传递配置部分?@aksh1989不清楚在同一个应用程序执行过程中是否同时需要SQL和Oracle,并根据条件注入或在应用程序的生命周期内使用任何一个?非常感谢。明白了!!
static void Main(string[] args)
{
    IUnityContainer objconatiner = new UnityContainer();
    objconatiner.RegisterType<Customer>();
    objconatiner.RegisterType<IDal, SqlserverDal>("SqlServer");
    objconatiner.RegisterType<IDal, OracleServerDal>("Oracle");

    Customer ocust = objconatiner.Resolve<Customer>();
    ocust.CustName = "Taylor Swift";
    ocust.Add();
}

public class Customer
{
    private IDal oidal;
    public string CustName { get; set; }

    public Customer([Dependency("SqlServer")]IDal idal)
    {
        oidal = idal;
    }

    public void Add()
    {
        oidal.Add();
    }
}