Я думал, что вся причина для интерфейсов, полиморфизма и шаблона, такого как инверсия управления через инъекции зависимостей, заключалась в том, чтобы избежать жесткой связи, разделения, модульности и т. Д.Почему я должен «подключать» инъекцию зависимостей в ASP.NET MVC?
Почему тогда я должен явно «подключить» интерфейс к конкретному классу, как в ASP.NET? Не будет ли у меня реестра быть некоторые вид связи? Мол,
services.AddTransient<ILogger, DatabaseLogger>();
Что делать, если взять регистратор, ILogger, и создать файл базы данных и класс, которые реализуют этот интерфейс.
В моей IoC,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
public interface ILogger
{
void logThis(string message);
}
public class DatabaseLogger : ILogger
{
public void logThis(string message)
{
//INSERT INTO table.....
System.Console.WriteLine("inserted into a databse table");
}
}
public class FileLogger : ILogger
{
public void logThis(string message)
{
System.Console.WriteLine("logged via file");
}
}
public class DemoClass
{
public ILogger myLogger;
public DemoClass(ILogger myLogger)
{
this.myLogger = myLogger;
}
public void logThis(string message)
{
this.myLogger.logThis(message);
}
}
class Program
{
static void Main(string[] args)
{
DemoClass myDemo = new DemoClass(new DatabaseLogger()); //Isn't this Dependency Injection?
myDemo.logThis("this is a message");
Console.ReadLine();
}
}
}
Так почему же я должен зарегистрировать или "провод на" что-нибудь? Разве это не зависимость от зависимостей через конструктор (у меня есть фундаментальное недоразумение)? Я мог бы разместить там любого регистратора, который реализовал ILogger.
Могу ли я создать два из них?
services.AddTransient<ILogger, DatabaseLogger>();
services.AddTransient<ILogger, FileLogger>();
Хорошо, если только интерфейс имеет только одну реализацию, как предполагается, что программа должна знать, какой. Вам нужно будет указать его на один из них или вы можете получить неожиданное поведение. –
@AlexKrupka Я не уверен, что понимаю. У меня две реализации. Я только экземпляр одного из них. – johnny
Для того чтобы DI был действительно ценным (по моему опыту), вам нужно посмотреть на более сложные сценарии. Например, компания A и компания B используют ваш сайт, но компания A является канадкой, а компания B - американец. Таким образом, вы привязываете реализацию расчета налогов на основе того, к какой компании принадлежит пользователь, а не к имплементации. который обрабатывает оба оператора If: –