Внедрение зависимости в.NET с примерами?

Сообщение об ошибке, которое вы видите, означает, что вы ожидаете, что объект p4 будет иметь метод .dist, но объект p4 является строковым объектом. Я думаю, что вас смущает то, что p1, p2 и p3 являются объектами Point (поэтому у них есть метод .dist), но когда вы выполняете метод .midpt для создания переменной p4, метод возвращает строку. Возвращает "(1.5,2.0)" против точки (1.5,2.0). Поэтому, если вы хотите, чтобы ваш код работал, вы должны изменить переменную calc в методе .midpt на что-то вроде этого:

calc = Point ((x1 + x2) / 2), ((y1 + y2) / 2))

28
задан Community 23 May 2017 в 12:25
поделиться

4 ответа

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

Итак, вы хотите использовать DI, чтобы отложить этот выбор до того, который можно настроить с помощью client.

Это некоторый псевдокод (примерно на основе Unity):

Вы создаете интерфейс ведения журнала:

public interface ILog
{
  void Log(string text);
}

затем используете этот интерфейс в своих классах

public class SomeClass
{
  [Dependency]
  public ILog Log {get;set;}
}

, вставляете эти зависимости во время выполнения

public class SomeClassFactory
{
  public SomeClass Create()
  {
    var result = new SomeClass();
    DependencyInjector.Inject(result);
    return result;
  }
}

, и экземпляр настроено в app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name ="unity"
             type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
              Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity>
    <typeAliases>
      <typeAlias alias="singleton"
                 type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity" />
    </typeAliases>
    <containers>
      <container>
        <types>
          <type type="MyAssembly.ILog,MyAssembly"
                mapTo="MyImplementations.SqlLog, MyImplementations">
            <lifetime type="singleton"/>
          </type>
        </types>
      </container>
    </containers>
  </unity>
</configuration>

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

33
ответ дан 28 November 2019 в 02:45
поделиться

У меня есть внедрение зависимостей с очень простым примером, подобным этому.

Посмотрите класс ниже, вы получите всю идею. Как видите, если вы не предоставите файл, он будет использовать один файл настроек по умолчанию, но вы можете установить файл настроек, и тогда класс будет его использовать.

Public Class ProcessFile

Private _SettingsFile As String = "settings.bin"

Public Sub New()
End Sub

Public Sub New(settings As String)
_SettingsFile= settings
End Sub

Public Function ReadFile() As String 
'Do stuff based on the settings stored in the _SettingsFile 
End Function

End Class

Очевидно, это самый простой случай. В реальном мире вы можете сделать то же самое с типами классов, например, у вас есть уровень базы данных, и вы можете переключить базовую dll базы данных, выполнив инъекцию зависимостей, и ваш код будет работать с любой базой данных, как только вы предоставите допустимый класс (класс, реализующий используемый вами интерфейс).

После получения базовых знаний вы можете делать это в более широком масштабе и полностью независимо от приложения, используя такие структуры DI, как unity.

1
ответ дан dr. evil 28 November 2019 в 02:45
поделиться

You essentially pass in all necessary objects in the constructor. Alternatively, you can resolve them at runtime using an interface resolver (although this is less typesafe). You can find excellent examples at the Ninject website for the first approach, and good examples at the Unity website for the second approach. This avoid the need for singletons and allows you to easily drop in a replacement object that conforms to the desired interface

0
ответ дан Steve 28 November 2019 в 02:45
поделиться

Ninject должен иметь один из самых крутых примеров: (по частям)

interface IWeapon {
  void Hit(string target);
}
class Sword : IWeapon {
  public void Hit(string target) {
    Console.WriteLine("Chopped {0} clean in half", target);
  }
}
class Shuriken : IWeapon {
  public void Hit(string target) {
    Console.WriteLine("Shuriken tossed on {0}", target);
  }
}
class Samurai {
  private IWeapon _weapon;

  [Inject]
  public Samurai(IWeapon weapon) {
    _weapon = weapon;
  }

  public void Attack(string target) {
    _weapon.Hit(target);
  }
}

class WeaponsModule: NinjectModule {
  private readonly bool _useMeleeWeapons;

  public WeaponsModule(bool useMeleeWeapons) {
    _useMeleeWeapons = useMeleeWeapons;
  }

  public void Load() {
    if (useMeleeWeapons)
      Bind<IWeapon>().To<Sword>();
    else
      Bind<IWeapon>().To<Shuriken>();
  }
}

class Program {
  public static void Main() {
    bool useMeleeWeapons = false;
    IKernel kernel = new StandardKernel(new WeaponsModule(useMeleeWeapons));
    Samurai warrior = kernel.Get<Samurai>();
    warrior.Attack("the evildoers");
  }
}

Это, на мой взгляд, читается очень бегло, прежде чем вы запустите свое додзё, вы можете решайте, как вооружить своих самураев.

32
ответ дан 28 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: