2017-02-19 4 views
0

DataAccessLayer.cs в DataAccess проекта:Зависимость впрыска во время выполнения с помощью Unity

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> 

Я просто установить Unity с NuGet в моем главном проекте.

Если у меня есть var instance = new MyClass(); в основном методе моего основного проекта, instance.Dal - null.

Как ввести значение Dal во время выполнения?

Update 1:

В идеале я хотел бы все зависимости моего основного проекта должны быть решены с помощью сценария на мой основной метод или непосредственно через конфигурацию. Является ли это возможным ?

+0

Что такое 'Log'? Вы не указали код для этого. – CodingYoshi

+0

К сожалению, я обновил свой ответ –

+0

Проверьте это: https://msdn.microsoft.com/en-us/library/ff649447.aspx. Это объясняет вложение свойств Unity. –

ответ

0

вы можете использовать инъекции конструктора, чтобы ввести зависимости в следующих

ПУТИ
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, чтобы узнать больше о регистрации, разрешения и инъекционные зависимостей.

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 для более подробной информации.

Смежные вопросы