首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autofac resolve IEnumerable<TComponent>仅用于实例化的项

Autofac resolve IEnumerable<TComponent>仅用于实例化的项
EN

Stack Overflow用户
提问于 2010-11-17 05:04:21
回答 1查看 464关注 0票数 0

autofac是否为我提供了一种获取元件的所有“活动”实例的方法?这样就可以实现以下功能:

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-18 17:09:38

恐怕不是开箱即用的--对于这种情况,您需要想出另一个方案。您可以使用OnActivated()OnRelease()事件来保存您自己的活动视图注册表:

代码语言:javascript
复制
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))
  });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4198937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档