2011-03-05 1 views
1

저는 Autofac 2.4.4.705를 사용하고 있습니다.Autofac : 삽입 된 컬렉션이 비어 있지 않습니다 (하나의 항목 만 포함)

다음 코드의 출력은 다음과 같습니다

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()); 
:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var builder = new Autofac.ContainerBuilder(); 
     builder.RegisterModule(new AutofacModule()); 
     using (var container = builder.Build()) 
     { 
      var x = container.Resolve<ObservableCollection<A>>(); 
      Console.WriteLine(x.Count); 
     } 
    } 
} 

class A 
{ 
} 

class AutofacModule : Autofac.Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()); 
     builder.RegisterGeneric(typeof(ObservableCollection<>)) 
      .As(typeof(ObservableCollection<>)); 
    } 
} 

그것은 문제가 보인다. (해결 된 컬렉션 나는 그것이 비어 있어야 하나 개의 항목 생각 포함을 의미) 1에 의해 원인

AutofacModule에서 제거하면 출력은 0입니다.

아이디어가 있으십니까?

감사

업데이트 :

아, 내가 지금 이해 생각합니다. Autofac은 모든 유형의 A를 해결하려고하며,이 예제 (A 자체)에는 A 유형이 하나이므로 ObservableCollection에 하나의 항목이 포함되어 있습니다. 이전에는 IEnumerable <>만이이 동작을한다고 생각했습니다. 그러나 IEnumerable <의 하위 유형에도이 동작이 있습니다.

하지만 가끔은 컬렉션을 삽입하는 것이 좋습니다. 예를 들어 DispacherNotifiedObservableCollection을 내 ViewModels에 삽입해야 할 때가 있습니다. 해결 방법은 무엇입니까?

업데이트 2 :

builder.RegisterGeneric(typeof(ExtendedObservableCollection<>)) 
    .As(typeof(IObservableCollection<>)) 
    .UsingConstructor(); 

public interface IObservableCollection<T> : 
    IList<T>, ICollection<T>, IEnumerable<T>, INotifyCollectionChanged, INotifyPropertyChanged 
{ 
    void AddRange(IEnumerable<T> list); 
    void Sort<TKey>(Func<T, TKey> keySelector, System.ComponentModel.ListSortDirection direction); 
    void Sort<TKey>(Func<T, TKey> keySelector, IComparer<TKey> comparer); 
} 

이제 모든 것이 잘 작동 : Nicholas Blumhardt의 답변에 따라

, 나는 내 코드를 변경했습니다. 감사!

답변

1

표시되는 동작은 ObservableCollection 형식에 IEnumerable을 허용하는 생성자가있는 결과입니다.

UseConstructor() 옵션을 사용하여 기본 생성자를 사용하도록 변경할 수 있습니다.

ObservableCollection 자체가 매우 잘 어울리지 않을 수 있습니다. 의미 체계가 일반적으로 무엇인지 분명하지 않습니다. 자체 인터페이스로 특수 구성 요소에 배치하는 것이 더 나은 옵션입니다.