簡體   English   中英

Autofac解決IEnumerable <TComponent> 僅適用於實例化項目

[英]Autofac resolve IEnumerable<TComponent> for instantiated items only

autofac是否為我提供了一種獲取組件的所有“活動”實例的方法? 因此,以下工作:

public class ViewManager {

    public ViewManager(Func<IEnumerable<MyView>> viewProvider, Func<string, MyView> viewFactory) {
        ViewProvider = viewProvider;
        ViewFactory = viewFactory;
    }

    public Func<IEnumerable<MyView>> ViewProvider { get; private set; }
    public Func<string, MyView> ViewFactory { get; private set; }

    public MyView GetView(string viewId) {
        var existing = from view in ViewProvider() //this would get me all the active views (not the available implementations)
                       where !view.IsDisposed
                             && view.Id == viewId
                       select view;
        return existing.FirstOrDefault() ?? ViewFactory(viewId);
    }
}

public class MyView: IDisposable {
    public MyView(string id) {
        Id = id;
    }
    public string Id { get; private set; }
    public bool IsDisposed { get; private set; }
    public void Dispose() {
        IsDisposed = true;
    }
}

恐怕不是開箱即用的-對於這種情況,您需要提出另一種方案。 您可能可以使用OnActivated()OnRelease()事件來保留自己的活動視圖注冊表:

builder.RegisterType<ViewRegistry>()
  .As<IViewRegistry>()
  .SingleInstance();

builder.RegisterType<MyView>()
  .OnActivated(e =>
     e.Context.Resolve<IViewRegistry>().Add(e.Instance))
  .OnRelease(e => {
     e.Instance.Dispose();
     e.Context.Resolve<IViewRegistry>().Remove(e.Instance))
  });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM