【问题标题】:Problem with MEF - ExportFactory<T> in Caliburn.MicroMEF 的问题 - Caliburn.Micro 中的 ExportFactory<T>
【发布时间】:2011-01-04 15:21:07
【问题描述】:

我在 Caliburn.Micro 中使用 MEF 导出视图模型类。我想使用 ExportFactory 类而不是 Export 属性,因为我尝试解决与此处所述相同的问题: Object destruction problem with MEF

我尝试解决这个问题,例如:

一些视图模型 - WPF 窗口:

[Export(typeof(IChatViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ChatViewModel : Screen, IViewModelIdentity, 
    IChatViewModel, IHandle<Rp>, IHandle<DetailData>
{}

我在其他一些视图模型类中使用窗口管理器打开聊天屏幕:

private IWindowManager _windowManager;
var chatScreen = IoC.Get<IChatViewModel>();
_windowManager.Show(chatScreen);

然后我关闭屏幕,但是这个类的对象还活着。我尝试与此处描述的相同的问题: Object destruction problem with MEF

我有视图模型 - 它是 WPF 窗口

场景/解决方案

我有 3 个视图模型/屏幕:

  • Lo​​gOnViewModel - 用户控制
  • MessengerViewModel - 用户控件
  • ChatViewModel - WPF 窗口

这些视图模型的代码在这里:

//#1 screen - user control
public class LogOnViewModel : Screen, ILogOnViewModel
{
    private IShellViewModel _shell;

    [ImportingConstructor]
    public LogOnViewModel(IShellViewModel shell)
    {
        _shell = shell;
    }

    //....

    //Active #2 screen Messenger screen
     _shell.ShowMessenger(_account);

    //....
}

//#2 screen - user control
public class MessengerViewModel : Screen,IMessengerViewModel
{       
    private IViewModelsControler _viewModelControler;
    private IWindowManager _windowManager;

    [ImportingConstructor]
    public MessengerViewModel(IViewModelsControler viewModelControler, IWindowManager windowManager)
    {
        _windowManager = windowManager;
        _viewModelControler = viewModelControler;

    }

    //...

    //Open #3 sceen - WPF window
    var vindow = _viewModelControler.CreateChatViewModel();
    _windowManager.Show(window);

    //...
}

//#3 screen - WPF window
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ChatViewModel : Screen, IChatViewModel
{

}

我的外壳是这样的:

  //SHELL is WPF window  
    [Export(typeof(IShellViewModel))]
    public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShellViewModel
    {
        [Import]
        public IViewModelsControler ViewModelControler{ get; set;}

        protected override void OnInitialize()
        {
            ShowLogOn();
            base.OnInitialize();
        }

        public void ShowLogOn()
        {
            //var vm = IoC.Get<ILogOnViewModel>();
            var vm = ViewModelControler.CreateLogOnViewModel();
            ActivateItem(vm);
        }

        public void ShowMessenger(Account account)
        {
            ActiveItem.Deactivate(true);
            //var vm = IoC.Get<IMessengerViewModel>();
            var vm = ViewModelControler.CreateMessengerViewModel();
            vm.Account = account;
            ActivateItem(vm);
        }

    }

我想使用 ExportFactory 类来创建视图模型类。我尝试实现与此处相同的逻辑:http://mef.codeplex.com/wikipage?title=PartCreator.

所以我创建了自己的控制器来创建视图模型类:

这里是:

public  interface IViewModelsControler
{
    ILogOnViewModel CreateLogOnViewModel();
    IMessengerViewModel CreateMessengerViewModel();
    IChatViewModel CreatChatViewModel();
}

[Export(typeof(IViewModelsControler))]
public class ViewModelsControler:IViewModelsControler
{
    [Import]
    public ExportFactory<ILogOnViewModel> LogOnViewFactory { get; set; }

    public  ILogOnViewModel CreateLogOnViewModel()
    {
        return LogOnViewFactory.CreateExport().Value;
    }

    [Import]
    public ExportFactory<IMessengerViewModel> MessengerViewFactory { get; set; }

    public IMessengerViewModel CreateMessengerViewModel()
    {
        return MessengerViewFactory.CreateExport().Value;
    }

    [Import]
    public ExportFactory<IChatViewModel> ChatViewFactory { get; set; }

    public IChatViewModel CreatChatViewModel()
    {
        return ChatViewFactory.CreateExport().Value;
    }
}

我在这些类中导入 ViewModelsControler 类:

  • ShellViewModel
  • MessengerViewModel

并希望在创建视图模型类时使用 ViewModelsControler 类的方法。 - 列表项

我不知道我做错了什么,如果我尝试编译这段代码我得到这个错误:

找不到合约 Spirit.ViewModels.IShellViewModel 的任何实例。 追踪: 在 C:\Users\Jan\Documents\Visual Studio 2010\Projects\C#\Pokec_Messenger\ver.beta\Pokec__Messenger\Spirit_Caliburn_Micro_v1.0\BootStraper\MefBootStrapper.cs 中的 Spirit.BootStraper.MefBootStrapper.GetInstance(Type serviceType, String key) :第 59 行 在 C:\Users\Jan\Documents\Visual Studio 2010\Projects\C#\Pokec_Messenger\ver.beta\Pokec__Messenger\Caliburn_Micro_Completed\CaliburnMicro\src\Caliburn.Micro.Silverlight\IoC.cs 中的 Caliburn.Micro.IoC.GetT:第 33 行 在 C:\Users\Jan\Documents\Visual Studio 2010\Projects\C#\Pokec_Messenger\ver.beta\Pokec__Messenger\Caliburn_Micro_Completed\CaliburnMicro\src\Caliburn.Micro.Silverlight\ 中的 Caliburn.Micro.Bootstrapper`1.DisplayRootView()引导程序.cs:第 175 行 在 C:\Users\Jan\Documents\Visual Studio 2010\Projects\C#\Pokec_Messenger\ver.beta\Pokec__Messenger\Caliburn_Micro_Completed\CaliburnMicro\src\Caliburn.Micro 中的 Caliburn.Micro.Bootstrapper.OnStartup(Object sender, StartupEventArgs e) .Silverlight\Bootstrapper.cs:第 128 行 在 System.Windows.Application.OnStartup(StartupEventArgs e) 在 System.Windows.Application.<.ctor>b__1(未使用的对象) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托回调,对象 args,Int32 numArgs) 在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

如果我在创建视图模型类上使用 Export 属性,效果很好。

类似这样的:

[Export(typeof(ILogOnViewModel))]
public class LogOnViewModel : Screen,ILogOnViewModel
{}

和外壳:

   [Export(typeof(IShellViewModel))]
    public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShellViewModel
    {
        protected override void OnInitialize()
        {
            ShowLogOn();
            base.OnInitialize();
        }

        public void ShowLogOn()
        {
            var vm = IoC.Get<ILogOnViewModel>();
            //var vm = _viewModelControler.CreateLogOnViewModel();
            ActivateItem(vm);
        }

        public void ShowMessenger(Account account)
        {
            ActiveItem.Deactivate(true);
            var vm = IoC.Get<IMessengerViewModel>();
            //var vm = _viewModelControler.CreateMessengerViewModel();
            vm.Account = account;
            ActivateItem(vm);
        }

    }

哪里有问题?在 MEF 助推器类中?我使用经典的 MEF 助推带: http://devlicio.us/blogs/rob_eisenberg/archive/2010/07/08/caliburn-micro-soup-to-nuts-pt-2-customizing-the-bootstrapper.aspx

感谢您的建议、时间和帮助。

【问题讨论】:

    标签: wpf mef caliburn.micro


    【解决方案1】:

    您仍然需要导出要导出的类。使用 ExportFactory 允许您创建多个实例,但如果您没有要创建实例的事物的导出属性,则它不起作用。

    【讨论】:

    • 您好 Plaisted 先生,感谢您的解释。我有一个问题,它可能在 chatWindow 对象上调用 Dispose 方法。对象是使用 ExportFactory 创建的: var chatScreen = ViewModelControler.CreatChatViewModel();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多