将Shortbus从StructureMap v2升级到v3

时间:2015-07-02 14:52:51

标签: structuremap3

我已经开始使用Shortbus,但我在StructureMap.MVC5包和Shortbus之间遇到了一些DLL版本问题。 Shortbus使用StructureMap 2.6.3,MVC5包使用2.6.3。

我尝试过依赖重定向,但是由于MajorVersion的改变,Shortbus导致了我的问题。

由于它是一个开源项目,我决定尝试将Shortbus升级到StructureMap的第3版。

我坚持要移动这段旧代码:

viewDidLoad

..到版本3.问题在于Register以及ObjectFactory现在被认为是过时的事实。

我认为我需要根据以下答案创建自己的ObjectFactory:https://stackoverflow.com/a/25551005/119624

并包含我自己的注册表。任何人都可以通过一些代码帮助我吗?

1 个答案:

答案 0 :(得分:1)

我总是建议不要在可能的情况下使用对象工厂,但是如果有需要访问容器的情况并且无法通过构造函数注入或属性设置器注入它,那么你就是在你的假设中纠正,创建你自己的ObjectFactory实现是下一个最好的事情。

您的参考链接是创建自己的ObjectFactory的良好起点,从这里您只需注册您的StructureMap注册表:

private static Container defaultContainer()
{
    return new Container(x =>
    {
        x.AddRegistry<WebsiteRegistry1>();
        x.AddRegistry<WebsiteRegistry2>();
     });
 }

如果您正在撰写网站或网络应用程序 - 我认为如果您正在使用ShortBus,那么另一种方法是使用HttpContext有界嵌套容器。您可以在此处创建容器的嵌套版本(more on nested containers here),该版本存储在每个页面请求的HttpContext对象中。然后,您可以使用静态实例返回容器的实例。

要了解如何做到这一点,我建议您在此处查看Jimmy Bogard's ContosoUniversity重写(see here for usage):

public class StructureMapValidatorFactory : ValidatorFactoryBase
{
    public override IValidator CreateInstance(Type validatorType)
    {
        return StructuremapMvc.ParentScope.CurrentNestedContainer.TryGetInstance(validatorType) as IValidator;
    }
}

可以查看此类用法的设置herehere

我希望这会有所帮助。如果您对此有任何疑问,我很乐意尽我所能帮助他们。

旁注: 如果您正在使用ShortBus,我建议您也查看Mediatr。它基于ShortBus,但有一些额外的功能和更好的文档。