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

时间:2017-02-19 17:53:14

标签: c# dependency-injection unity-container

DataAccessLayer.cs项目中的

DataAccess

public class DataAccessLayer : IDataAccessLayer
{
    public void Bar()
    {
        // Implementation
    }
}
IDataAccessLayer.cs项目中的

DataAccess.Contracts

public interface IDataAccessLayer
{
    void Bar();
}
MyClass.cs项目(控制台应用程序)中的

Main

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。

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

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

更新1:

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

2 个答案:

答案 0 :(得分:2)

我建议您使用构造函数注入,因为它使依赖项非常清晰:

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了解详情。

答案 1 :(得分:0)

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

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

    public IDataAccessLayer Dal { get; set; } 
}

要解决依赖关系,您必须先从config中将这些加载到容器中。

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

请参阅Dependency Injection with Unity以了解有关注册,解析和注入依赖项的更多信息。