使用 Unity 在运行时进行依赖注入

Dependency injection at runtime using Unity

DataAccessLayer.csDataAccess 项目中:

public class DataAccessLayer : IDataAccessLayer
{
    public void Bar()
    {
        // Implementation
    }
}

IDataAccessLayer.csDataAccess.Contracts 项目中:

public interface IDataAccessLayer
{
    void Bar();
}

MyClass.csMain 项目中(控制台应用程序):

public class MyClass
{
    public IDataAccessLayer Dal { get; set; } /// Her I want to inject dependency at runtime
}

我想在运行时直接在MyClass.Dal 属性 中注入依赖。我在主项目中使用 Unity 和配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <container>
    <register type="DataAccess.Contracts.IDataAccessLayer, DataAccess.Contracts" mapTo="DataAccess.DataAccessLayer, DataAccess"/>
  </container>
</unity>

我只是在我的主项目中从 Nuget 安装了 Unity。

如果我在主项目的 main 方法中执行 var instance = new MyClass();instance.Dal 为空。

如何在运行时注入Dal的值?

更新 1:

理想情况下,我希望我的主项目的所有依赖项都通过我的主要方法中的脚本或直接通过配置来解决。可能吗?

我建议你改用构造函数注入,因为它使依赖关系非常清楚:

public class MyClass
{
    public MyClass(IDataAccessLayer dal)
    {
        this.Dal = dal;
    }
    public IDataAccessLayer Dal { get; set; } 
}

或在您的 属性 上使用 DependencyAttribute 进行 属性 注射:

[DependencyAttribute]
public IDataAccessLayer Dal { get; set; } 

请阅读What does Unity Do了解更多详情。

您可以使用构造函数注入以下列方式注入依赖项-

public class MyClass
{
    public MyClass (IDataAccessLayer dal)
    {
        this.Dal = dal;
    }

    public IDataAccessLayer Dal { get; set; } 
}

要解决依赖关系,您必须先从配置中将它们加载到容器中。

IUnityContainer container = new UnityContainer();
container.LoadConfiguration();
MyClass myClass = container.Resolve<MyClass>(); -- instance of IDataAccessLayer will be injected in myClass

参考Dependency Injection with Unity了解更多关于注册、解析和注入依赖的信息。