2010-10-05 6 views
2

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

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); 
     } 
} 

И код reistration:

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"); 
       }; 
    }); 

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

ответ

3

Если вы используете недавнюю сборку, вы можете использовать генератор IGenericDependency, например. 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 выберет правильную реализацию.

НТН

+0

Ничего себе, я знал, что должен быть какой-то аккуратнее решение :-) Это экономит много кода. Должен быть как пример в вики. – user137348

Смежные вопросы