C# Autofac resolve IEnumerable<;t组件>;仅适用于实例化项目

C# Autofac resolve IEnumerable<;t组件>;仅适用于实例化项目,c#,.net,autofac,C#,.net,Autofac,autofac是否为我提供了获取组件所有“活动”实例的方法? 因此,以下工作: public class ViewManager { public ViewManager(Func<IEnumerable<MyView>> viewProvider, Func<string, MyView> viewFactory) { ViewProvider = viewProvider; ViewFactory = viewFa

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;
    }
}
公共类视图管理器{
公共视图管理器(Func viewProvider、Func viewFactory){
ViewProvider=ViewProvider;
ViewFactory=ViewFactory;
}
公共Func视图提供程序{get;private set;}
public Func ViewFactory{get;private set;}
公共MyView GetView(字符串视图ID){
var existing=来自ViewProvider()中的视图//这将获取所有活动视图(而不是可用的实现)
where!view.IsDisposed
&&view.Id==viewId
选择视图;
返回现有的.FirstOrDefault()??ViewFactory(viewId);
}
}
公共类MyView:IDisposable{
公共MyView(字符串id){
Id=Id;
}
公共字符串Id{get;private set;}
公共布尔值显示为{get;private set;}
公共空间处置(){
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))
  });
builder.RegisterType()
.As()
.SingleInstance();
builder.RegisterType()
.on已激活(e=>
e、 Context.Resolve().Add(例如实例))
.OnRelease(e=>{
e、 Dispose();
e、 Context.Resolve().Remove(例如实例))
});

谢谢尼古拉斯。我已经用我自己的缓存使用了类似的东西。OnRelease是否仅在释放父容器时调用,或者是否有其他方法强制释放组件?要在容器之前释放组件,您需要使用
BeginLifetimeScope()
Owned
-