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;
}
}发布于 2010-11-18 17:09:38
恐怕不是开箱即用的--对于这种情况,您需要想出另一个方案。您可以使用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))
});https://stackoverflow.com/questions/4198937
复制相似问题