【问题标题】:How to resolve a collection of interfaces with Unity?如何使用 Unity 解析接口集合?
【发布时间】:2015-11-06 20:46:51
【问题描述】:

我有一个带有构造函数的类,它采用一组子接口

public class Manager : IManager
{
   public Manager(IEnumerable<IDataAccess> dataAccess)
   {

IDataAccess 是一个基础接口

public interface IFooDataAccess : IDataAccess
{

public interface IBarDataAccess : IDataAccess
{

public interface IBazDataAccess : IDataAccess
{

每个都有具体的实现。 当我解析 IManager 时,我希望 dataAccess 参数填充 FooDataAccess、BarDataAccess 和 BazDataAccess 的集合。

我用unity作为IoC,目前注册的是:

    public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterTypes(AllClasses.FromAssemblies(
                typeof(IManager).Assembly),
            WithMappings.FromMatchingInterface,
            WithName.Default,
            WithLifetime.ContainerControlled);

我在解决方案中也有一些其他类(因此使用注册模式),所以我想保留它。我一直在尝试自己注册 IManager:

        var allDataAccesses = container.ResolveAll<IDataAccess>();
        var parameter = new InjectionConstructor(allDataAccesses);
        container.RegisterType<IManager, Manager>(parameter);

但我无法让它工作,我错过了什么。如何配置unity来解析构造函数?

【问题讨论】:

    标签: c# unity-container


    【解决方案1】:

    您所做的注册将映射直接实现的接口,而不是IDataAccess

    例如,它将IFooDataAccess 映射到FooDataAccess。例如,您需要将IDataAccess 映射到FooDataAccess

    要解决这个问题,请添加以下注册码:

    container.RegisterTypes(
        typeof (IManager)
            .Assembly
            .GetTypes()
            .Where(x => x.IsClass)
            .Where(x => typeof (IDataAccess).IsAssignableFrom(x)),
        x => new[] {typeof (IDataAccess)},
        WithName.TypeName, WithLifetime.ContainerControlled);
    

    这将在程序集中搜索实现IDataAccess(直接或间接)的类,并将在IDataAccess 和这些类之间创建一个映射。

    这里需要注意的重要一点是它为注册提供了一个名称。这很重要,因为如果您将接口IDataAccess 映射到许多类,则不能使用默认名称。 unity 如何知道要使用哪个地图条目?

    您需要做的另一件事是将IEnumerable&lt;IDataAccess&gt; 映射到IDataAccess[],如下所示:

    container.RegisterType<IEnumerable<IDataAccess>, IDataAccess[]>();
    

    Unity 知道如何通过查看所需接口的命名注册来解析数组。默认情况下,它不能对IEnumerable&lt;T&gt; 执行相同的操作。另一种方法是更改​​构造函数以使用这样的数组:

    public class Manager : IManager
    {
        public Manager(IDataAccess[] dataAccess)
        {
            ....
        }
    
        ....
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      相关资源
      最近更新 更多