2017-02-18 2 views
2

DataAccessLayer.cs в DataAccess проекта:Лучший способ придать зависимость во время выполнения

public class Foo : IFoo 
{ 
    public void Bar() 
    { 
     // Implementation 
    } 
} 

IDataAccessLayer.cs в DataAccess.Contracts проекта:

public interface IFoo 
{ 
    void Bar(); 
} 

MainClass.cs в Main проекта:

class Program 
{ 
    public static IFoo Foo { get; set; } // Her I want to inject dependency directly at runtime 

    static void Main(string[] args) 
    { 
    } 
} 

Я хочу INJ ect зависимость в Foo собственности непосредственно во время выполнения.

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

Каков наилучший способ для этого? Как это сделать с Unity, если это возможно?

+0

Итак, вы хотите использовать экземпляр DataAccessLayer в своей основной функции? –

+0

@VasilutLucian Да –

+2

Dependency Injection - это создание * слабо связанного приложения, которое позволяет вводить зависимости (обычно через конструктор класса). Часть этого процесса заключается в том, чтобы ограничить дизайн, включая удаление статических переменных (или свойств) и замену их на * управление жизненным циклом * контейнера DI. Таким образом, нет, вы не можете просто выбросить какой-либо дизайн и ожидать, что Dependency Injection будет адаптироваться к нему, вам нужно адаптировать дизайн к DI-friendly. Прочитайте [Injection Dependency in .NET] (https://www.manning.com/books/dependency-injection-in-dot-net) для понимания дизайна с помощью DI. – NightOwl888

ответ

0

Вы можете установить из пакета NuGet Unity. Затем, вы можете просто сделать что-то вроде этого:

static void Main(string[] args) 
    { 
     var unityContainer = new UnityContainer(); 
     unityContainer.RegisterType<IDataAccessLayer, DataAccessLayer>(); 
     var instancerOfDataAccessLayer = unityContainer.Resolve<IDataAccessLayer>(); 
     instancerOfDataAccessLayer.Foo(); 
     Console.ReadLine(); 
    } 

Больше информации о Unity вы можете найти здесь: http://geekswithblogs.net/danielggarcia/archive/2014/01/23/introduction-to-dependency-injection-with-unity.aspx

Надеется, что это помогает.

+0

Это работает. Но мой основной проект должен иметь ссылки на «Проект DataAccess» и «Проект DataAccess.Contracts». Так в чем же смысл делать это вместо того, чтобы делать это непосредственно «var instance = new DataAccessLayer()» в этом случае? –

+0

В вашем случае нормально создавать экземпляр 'DataAccessLayer'. Но в более сложном применении принцип Injection Dependency очень используется (вы можете прочитать об этом в Интернете). Кроме того, если вы хотите протестировать какое-то большое приложение, очень полезно иметь DI, вы можете создать mock repository и другие вещи. Вы попросили пример, используя Unity для вашего примера, и это небольшая часть мощности DI :) –

+0

Спасибо за ваш весьма исчерпывающий ответ. Возможно ли в моем основном методе встраивать зависимости ко всем свойствам моего основного проекта? Например, в моем основном проекте у меня есть класс журнала, который содержит свойство IDataAccessLayer. –

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