Изменить: этот ответ, на мой взгляд, устарел, потому что он предполагает более старую версию Unity. Ответ NotDan лучше.
У вас есть несколько вариантов. Они, честно говоря, немного неубедительны, но они будут работать.
Вариант 1: Контейнер с ограниченным объемом
Если вы хотите использовать конструктор инъекции, вам нужно создать ограниченный контейнер и поместите свои данные в этот контейнер с заданной областью:
IUnityContainer subContainer = _container.CreateChildContainer();
//Don't do this... create a custom type other than string, like
// MyConstructorParams or something like that... this gets the point across.
subContainer.RegisterInstance<string>("John");
Person person = subContainer.Resolve<Person>();
Вариант 2: Метод инициализации
Однако обычно я делаю отдельный метод инициализации на моем целевые объекты для переменных экземпляра:
открытый класс Person { общедоступный человек (команды IApplicationCommands) {..} public void Initialize (имя строки) {..} .. }
И тогда ваше использование становится следующим:
Person person = container.Resolve<Person>();
person.Initialize("John");
Ни то, ни другое не особенно приятно, но оно выполнит свою работу. Важно выбрать соглашение и придерживаться его, иначе вы немного заблудитесь.
Надеюсь, это поможет.
Я не могу придумать, как сделать это с помощью внедрения конструктора. Я думаю, вам нужно будет использовать инъекцию свойств для зависимостей (отмеченных атрибутом Dependency), а затем либо взять только строку в конструкторе, создать экземпляр самостоятельно, а затем использовать BuildUp , чтобы подключите зависимости или сделайте строку свойством, которое вы задаете вручную после разрешения.
Есть несколько вариантов, которые вы можете рассмотреть:
В случае, когда вам нужно создать новый объект, который имеет допустимые зависимости в дополнение к любым предоставляемым данным (например, имя клиента), инкапсулируйте это в фабрику, которая сама была внедрена в вызывающий объект:
Person person = _personFactory.CreatePerson("bubba");
Фабрика может быть введена с зависимостями сущности и предоставлена конструктору, если требуется, или установлена другими способами, если необязательно:
var person = new Person("bubba", _domainService);
Для зависимостей переходных переменных, таких как стратегия, используемая конкретным методом, используйте Double Dispatch:
public class Person
{
public void DoSomethingWith(SomeStrategy strategy)
{
strategy.DoSomething(this);
}
}
Могу ли я передать параметры конструктора в метод Unity Resolve ()?
container.Resolve<IFoo>(new ParameterOverrides<Foo> { { "name", "bar" }, { "address", 42 } });"