저는 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의 답변에 따라
, 나는 내 코드를 변경했습니다. 감사!