Я пишу небольшую утилиту для себя, поэтому пока я использую Unity, я могу перейти на другой контейнер IoC, если это позволит мне обойти эту проблему.
Я хочу создать классэто дает некоторые данные при его создании, но после этого остается неизменным, обычно я делаю это следующим образом:
class SomeItem
{
public SomeItem(string name)
{
Name = name;
Hash = new SomeHashingClass().GenerateHash(name);
}
public string Name { get; private set; }
public string Hash { get; private set; }
}
Проблема заключается в зависимости от SomeHashingClass в конструкторе, как я могу вставить его при сохранениинеизменяемый объект?
Один из способов состоит в том, чтобы конструктор взял только зависимость, а затем имел метод, который совпадает с текущим конструктором для выполнения реальной работы.Однако я ненавижу эту идею, поскольку она может оставить объект в существующем состоянии, но быть полностью недействительным.И код должен был бы быть написан, чтобы гарантировать, что метод может быть вызван только один раз.
Другой способ, который я вижу, это создать класс SomeItemFactory, который разрешается за единицу, затем вручную сделать зависимостьвпрыск для SomeItem, однако это удваивает объем кода:
class SomeItemFactory
{
IHashingClass _hashingClass;
public SomeItemFactory(IHashingClass hashingClass)
{
_hashingClass = hashingClass;
}
public SomeItem Create(string name)
{
return new SomeItem(_hashingClass, name);
}
}
class SomeItem
{
public SomeItem(IHashingClass hashingClass, string name)
{
Name = name;
Hash = hashingClass.GenerateHash(name);
}
public string Name { get; private set; }
public string Hash { get; private set; }
}
Пожалуйста, скажите мне, что есть чистый способ сделать это.Почему нет такого метода, как:
unityContainer.Resolve<SomeItem>("the items name");