Разрешение зависимости в зависимости от универсального типа - Autofac - PullRequest
2 голосов
/ 05 октября 2010

У меня есть универсальный класс (GenericClass), у которого есть зависимость в зависимости от универсального типа (IGenericDependency). Эта зависимость также является общей.

public class GenericClass<T>
{
      private readonly IGenericDependency;
}

Параметр типа неизвестен до времени выполнения.

Пока я сделал это:

Я ввожу Func.

public class GenericClass<T> : IGenericClass<T> where T:class , new()
{
      private readonly IGenericDependency _genericDependency;

      public GenericClass(Func<TypeIGenericDependency>> factory)
      {
            _genericDependency = factory(T);
      }
}

И регистрационный код:

  builder.RegisterGeneric(typeof (GenericClass<>)).As(typeof (IGenericClass<>));

  builder.Register<Func<Type, IGetDataCollection>>(c =>
  {
        var context = c.Resolve<IComponentContext>();
        return type =>
               {
                    if(type.Name.EndsWith("Entity"))
                    {
                        return (IGenericDependency)
                           context.Resolve(typeof (GetEntityCollection<>)
                           .MakeGenericType(type));
                    }
                    if(type.Name.EndsWith("TypedList"))
                    {
                        return (IGenericDependency)
                           context.Resolve(typeof (GetTypedList<>)
                           .MakeGenericType(type));
                    }
                    throw new NotSupportedException("Not supported type");
                };
  });

Мне интересно, есть ли другой способ сделать это.

1 Ответ

3 голосов
/ 06 октября 2010

Если вы используете последнюю сборку, вы можете использовать make IGenericDependency generic, например, IGenericDependency<T> затем используйте ограничения общего типа для различения реализаций:

public class GetTypedList<T> : IGenericDependency<T>
    where T : TypedList {
}

public class GetEntity<T> : IGenericDependency<T>
    where T : Entity {
}

GenericClass<T> зависит напрямую от IGenericDependency<T>.

Пока TypedList и Entity являются взаимоисключающими типами, Autofac будет выбирать правильную реализацию.

НТН

...