gpt4 book ai didi

structuremap - ViewModels 作为 MediatR、StructureMap、Caliburn.Micro 的处理程序

转载 作者:行者123 更新时间:2023-12-05 07:50:52 27 4
gpt4 key购买 nike

我们将 Caliburn.Micro 用于我们的 MVVM 框架,将 StructureMap 用于我们的 IoC 容器,并将 MediatR 用于我们的调解器实现。这一切都工作正常,除了注册 MediatR 事件处理程序的推荐方法不能很好地与 Caliburn 配合使用。Micro 推荐的方法是使用 ViewModel 作为它们自己的处理程序。

Caliburn.Micro 通过 EventAggregator 实现中介模式,这需要您将 IEventAggregator 注入(inject)您的 ViewModel 并订阅它自己(或实现 IHandle<> 接口(interface)的东西)。 MediatR 采用更加解耦的方法,建议您反射性地扫描程序集以查找关闭 IRequestHandler<,> 和其他类型的类型。

我认为我的问题是我缺乏使用 StructureMap 的经验。

我想做的是能够在 ViewModel 本身上实现 Handler 功能(如 Caliburn.Micro 建议的那样),同时确保 ViewModel 注册为 Caliburn.Micro 的单例。

    public class RibbonMenuViewModel : PropertyChangedBase, INotificationHandler<SomethingSelectedEvent> { }

当 StructureMap 处理以下注册表时,将有 2 个 RibbonMenuViewModel 实例:一个用于 Caliburn.Micro 的单例版本和一个关闭 MediatR INotificationHandler<> 通用类型的 transient 版本。

StructureMap 注册表

    public class ViewModelsRegistry : Registry
{
public ViewModelsRegistry()
{

// ensure registration for the ViewModel for Caliburn.Micro
this.ForConcreteType<RibbonMenuViewModel>().Configure.Singleton();


// MediatR handler registrations
this.Scan(s =>
{
s.Assembly(this.GetType().Assembly);

s.ConnectImplementationsToTypesClosing(typeof (IRequestHandler<,>));
s.ConnectImplementationsToTypesClosing(typeof (IAsyncRequestHandler<,>));
s.ConnectImplementationsToTypesClosing(typeof (INotificationHandler<>));
s.ConnectImplementationsToTypesClosing(typeof (IAsyncNotificationHandler<>));
});

}
}


我想要关于使用 Singleton ViewModel 注册作为 MediatR 的 INotificationHandler 实例的最佳方式的建议

这里是 Caliburn.Micro 配置引用:

Caliburn Bootstrap 配置

    protected override void Configure()
{
this.configureTypeMappings();

if (!Execute.InDesignMode)
{
this.configureIocContainer();
}
}

private void configureIocContainer()
{
this.container = new Container(this.getStructureMapConfig);
}


private void getStructureMapConfig(ConfigurationExpression cfg)
{
cfg.For<IWindowManager>().Use<WindowManager>().Singleton();

cfg.Scan(s =>
{
s.AssemblyContainingType<ViewModelsRegistry>();

s.LookForRegistries();
});
}


protected override IEnumerable<object> GetAllInstances(Type serviceType)
{
return this.container.GetAllInstances(serviceType).OfType<object>();
}


protected override object GetInstance(Type serviceType, string key)
{
if (serviceType == null) serviceType = typeof(object);
var returnValue = key == null
? this.container.GetInstance(serviceType) : this.container.GetInstance(serviceType, key);
return returnValue;
}
protected override void BuildUp(object instance) { this.container.BuildUp(instance); }



最佳答案

我遇到了类似的问题。这是我修复它的方法。

public class ViewModelsRegistry : Registry
{
public ViewModelsRegistry()
{

// MediatR handler registrations
this.Scan(s =>
{
s.Assembly(this.GetType().Assembly);

s.ConnectImplementationsToTypesClosing(typeof (IRequestHandler<,>));
s.ConnectImplementationsToTypesClosing(typeof (IAsyncRequestHandler<,>));
s.ConnectImplementationsToTypesClosing(typeof (INotificationHandler<>));
s.ConnectImplementationsToTypesClosing(typeof (IAsyncNotificationHandler<>));
s.ExcludeType<RibbonMenuViewModel>();
});
// ensure registration for the ViewModel for Caliburn.Micro

For(typeof(INotificationHandler<>)).Singleton().Add(typeof(RibbonMenuViewModel));

}
}

希望对您有所帮助。

关于structuremap - ViewModels 作为 MediatR、StructureMap、Caliburn.Micro 的处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35760395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com