0

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

我尝试过依赖重定向,但由于 MajorVersion 更改,Shortbus 给我带来了问题。

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

我一直在移动这个旧代码:

[Test]
public void StructureMapResolveSingleInstance()
{
    var registered = new Registered();

    ObjectFactory.Initialize(i => i.Register(registered));

    var resolver = new StructureMapDependencyResolver(ObjectFactory.Container);

    var resolved = (Registered) resolver.GetInstance(typeof (Registered));

    Assert.That(resolved, Is.EqualTo(registered));
}

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

我假设我需要根据这个答案创建自己的 ObjectFactory:https ://stackoverflow.com/a/25551005/119624

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

4

1 回答 1

1

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

您参考的链接是创建您自己的 ObjectFactory 的一个很好的起点,您只需从这里注册您的 StructureMap 注册表,如下所示:

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

如果您正在编写网站或 Web 应用程序——如果您使用 ShortBus,我假设您是这样,那么另一种方法是使用有HttpContext界嵌套容器。这是您创建容器的嵌套版本的地方(更多关于嵌套容器在这里)存储在HttpContext每个页面请求的对象中。然后,您可以使用静态实例返回容器的实例。

要了解如何做到这一点,我建议您查看Jimmy Bogard 的 ContosoUniversity rewrite here,他就是这样做的(请参阅此处了解用法):

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

可以在此处此处查看此类用法的设置。

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

旁注:如果您使用的是 ShortBus,我建议您也看看Mediatr。它基于 ShortBus,但具有一些附加功能和更好的文档。

于 2015-07-05T00:06:36.743 回答