Unity:按特定顺序解析所有已注册类型实例的列表
Unity: Resolve list of all registered instances of type in specific order
我正在注册一个特定 class 的多个实例来实现一些接口(在示例 IInteractivityTarget
中)。
RootContainer.RegisterInstance<IInteractivityTarget>(Name, new InteractivityTarget(Name));
我还注册了该类型的Enumerable,自动解析所有注册实例的列表。
Container.RegisterType<IEnumerable<IInteractivityTarget>, IInteractivityTarget[]>();
现在的问题是我没有机会定义一些排序 (-info) 来在解析项目时按特定顺序获取这些项目。如何实现?我不想使用 SortHint-属性.
扩展 IInteractivityItem
更详细的示例:
public void RegisterInteractivity(string name, string sortHint){
if (!Container.IsRegistered(typeof(IEnumerable<IInteractivityTarget>))){
Container.RegisterType<IEnumerable<IInteractivityTarget>, IInteractivityTarget[]>();
}
Container.RegisterInstance<IInteractivityTarget>(Name, new InteractivityTarget(Name, sortHint));
}
RegisterInteravtivity("Show in View A", "aaa");
RegisterInteravtivity("Show in View A", "bbb");
RegisterInteravtivity("Show in View A", "ddd");
RegisterInteravtivity("Show in View A", "eee");
RegisterInteravtivity("Show in View A", "ccc");
RegisterInteravtivity("Show in View A", "aab");
/// --> this should be resolved ordered by SortHint
var interactivityTargets = Container.Resolve<IEnumerable<IInteractivity>>()
I dont want to extend the IInteractivityItem with a SortHint-property
您将需要某种排序提示,可以是 属性 或属性。
或者,您可以创建一个保留顺序的自定义注册表。
示例:
public interface IInteractivityRegistry
{
void Add<T>() where T : IInteractivity;
IReadOnlyList<IInteractivity> ResolveAllInOrder();
}
internal class UnityInteractivityRegistry : IInteractivityRegistry
{
public UnityInteractivityRegistry(IUnityContainer container)
{
_container = container;
}
#region IInteractivityRegistry
public void Add<T>() where T : IInteractivity
{
_interactivities.Add( typeof(T) );
}
public IReadOnlyList<IInteractivity> ResolveAllInOrder()
{
return _interactivities.Select( x => _container.Resolve( x ) ).ToArray();
}
#endregion
#region private
private readonly List<Type> _interactivities = new List<Type>();
private readonly IUnityContainer _container;
#endregion
}
请注意,我们注入了容器,尽管这显然是一种代码味道。但是 UnityInteractivityRegistry
或多或少是对容器的扩展,所以我想,这是有道理的。此外,在实际应用程序中,IInteractivityRegistry
当然必须拆分为两个接口。
我正在注册一个特定 class 的多个实例来实现一些接口(在示例 IInteractivityTarget
中)。
RootContainer.RegisterInstance<IInteractivityTarget>(Name, new InteractivityTarget(Name));
我还注册了该类型的Enumerable,自动解析所有注册实例的列表。
Container.RegisterType<IEnumerable<IInteractivityTarget>, IInteractivityTarget[]>();
现在的问题是我没有机会定义一些排序 (-info) 来在解析项目时按特定顺序获取这些项目。如何实现?我不想使用 SortHint-属性.
扩展 IInteractivityItem更详细的示例:
public void RegisterInteractivity(string name, string sortHint){
if (!Container.IsRegistered(typeof(IEnumerable<IInteractivityTarget>))){
Container.RegisterType<IEnumerable<IInteractivityTarget>, IInteractivityTarget[]>();
}
Container.RegisterInstance<IInteractivityTarget>(Name, new InteractivityTarget(Name, sortHint));
}
RegisterInteravtivity("Show in View A", "aaa");
RegisterInteravtivity("Show in View A", "bbb");
RegisterInteravtivity("Show in View A", "ddd");
RegisterInteravtivity("Show in View A", "eee");
RegisterInteravtivity("Show in View A", "ccc");
RegisterInteravtivity("Show in View A", "aab");
/// --> this should be resolved ordered by SortHint
var interactivityTargets = Container.Resolve<IEnumerable<IInteractivity>>()
I dont want to extend the IInteractivityItem with a SortHint-property
您将需要某种排序提示,可以是 属性 或属性。
或者,您可以创建一个保留顺序的自定义注册表。
示例:
public interface IInteractivityRegistry
{
void Add<T>() where T : IInteractivity;
IReadOnlyList<IInteractivity> ResolveAllInOrder();
}
internal class UnityInteractivityRegistry : IInteractivityRegistry
{
public UnityInteractivityRegistry(IUnityContainer container)
{
_container = container;
}
#region IInteractivityRegistry
public void Add<T>() where T : IInteractivity
{
_interactivities.Add( typeof(T) );
}
public IReadOnlyList<IInteractivity> ResolveAllInOrder()
{
return _interactivities.Select( x => _container.Resolve( x ) ).ToArray();
}
#endregion
#region private
private readonly List<Type> _interactivities = new List<Type>();
private readonly IUnityContainer _container;
#endregion
}
请注意,我们注入了容器,尽管这显然是一种代码味道。但是 UnityInteractivityRegistry
或多或少是对容器的扩展,所以我想,这是有道理的。此外,在实际应用程序中,IInteractivityRegistry
当然必须拆分为两个接口。