Насколько я могу судить, такое использование не возможно, поскольку ваш контейнер Io C не знает, как разрешить ICacheService
, поскольку вы зарегистрировали экземпляры как CacheService
. Когда DryIo c пытается разрешить SettingsPageViewModel
, он встречает ICacheService
и обнаруживает, что тип не зарегистрирован. По крайней мере, так ведет себя контейнер Unity .
В любом случае, даже , если вы зарегистрировали "LocalMachineCache"
и "UserAccountCache"
как ICacheService
Я сомневаюсь, что это ' d работает, поскольку для DryIo c не будет никакого способа узнать, какой из них будет использоваться с SettingsPageViewModel
, поэтому вам придется определить, какой из них разрешить.
Согласно документации, Prism разрешает зависимости по имени соответствующего параметра (если я не понял это неправильно, см. Здесь ). Предполагая, что вам нужен кэш локального компьютера в ваших настройках, вы можете зарегистрировать его как "localMachineCache"
(переименовать в соответствии с общими C# соглашениями кодирования в конструкторе SettingsPageViewModel
) и присвоить параметру то самое имя
containerRegistry.RegisterInstance<ICacheService>(new CacheService(BlobCache.LocalMachine, "MyAppName"), "localMachineCache");
containerRegistry.RegisterInstance<ICacheService>(new CacheService(BlobCache.UserAccount, "MyAppName"), "userAccountCache");
public SettingsPageViewModel(ICacheService localMachineCache)
{
CacheService = localMachineCache;
}
И соответственно, если вам нужны оба
public SettingsPageViewModel(ICacheService localMachineCache, ICacheService userAccountCache)
{
MachineCacheService = localMachineCache;
UserAccountCacheService = userAccountCache;
}
Edit
Несмотря на то, что это написано в документации, именованные сервисы, похоже, не работают так, как документация состояний. Однако, в зависимости от выбора контейнера Io C, все еще возможно вводить сервисы по их именам.
DryIo c
С параметром made
IContainer.Register
вы можете указать фабричная функция для создания экземпляров указанного типа. Поскольку Prism помещает абстракцию Io C в используемую платформу, сначала вам нужно получить экземпляр DryIo c IContainer
var container = ((DryIocContainerExtension)containerRegistry).Instance;
, теперь вы можете указать, как создавать экземпляры * 1044. * с
container.Register(Made.Of(
() => new SettingsPageViewModel(Arg.Of<ICacheService>("LocalMachineCache"))));
Строка, переданная Arg.Of
, является служебным ключом, служба зарегистрирована и сообщает DryIoc
какой ICacheService
разрешить ( обратите внимание , что Я использовал ваше оригинальное имя).
Unity
При единстве есть как минимум два способа добиться этого. Первый - получить экземпляр через UnityContainerExtension
(аналог версии DryIo c) и использовать RegisterFactory
unityContainer.RegisterFactory<SettingsPageViewModel>(
container => new SettingsPageViewModel(container.Resolve<ICacheService>("LocalMachineCache")));
Другой вариант - добавить DependencyAttribute
к параметрам конструктора. модели представления
public SettingsPageViewModel([Unity.Dependency("LocalMachineCache")] ICacheService localMachineCache)
{
CacheService = localMachineCache;
}