将 Shortbus 从 StructureMap v2 升级到 v3
Upgrading Shortbus from StructureMap v2 to v3
我已经开始使用 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:
并包括我自己的注册表。任何人都可以用一些代码帮助我吗?
我总是建议尽可能不要使用对象工厂,但是如果在某些情况下您需要访问容器并且无法通过构造函数注入或 属性 setter 注入它那么您的假设是正确的,即创建您自己的 ObjectFactory 实现是下一个最好的选择。
您的 link 参考资料是创建您自己的 ObjectFactory 的良好起点,从这里您需要做的就是像这样注册您的 StructureMap 注册表:
private static Container defaultContainer()
{
return new Container(x =>
{
x.AddRegistry<WebsiteRegistry1>();
x.AddRegistry<WebsiteRegistry2>();
});
}
如果您正在编写网站或 Web 应用程序 - 我假设您正在使用 ShortBus,那么另一种方法是使用 HttpContext
有界嵌套容器。这是您创建容器 (more on nested containers here) 的嵌套版本的地方,它存储在每个页面请求的 HttpContext
对象中。然后,您可以 return 一个使用静态实例的容器实例。
要了解如何做到这一点,我建议您看一下 Jimmy Bogard's ContosoUniversity rewrite here he does just this (see here for usage):
public class StructureMapValidatorFactory : ValidatorFactoryBase
{
public override IValidator CreateInstance(Type validatorType)
{
return StructuremapMvc.ParentScope.CurrentNestedContainer.TryGetInstance(validatorType) as IValidator;
}
}
希望对您有所帮助。如果您对此有任何疑问,我很乐意尽我所能帮助回答。
旁注:
如果您使用的是 ShortBus,我建议您也看看 Mediatr。它基于 ShortBus,但具有一些附加功能和更好的文档。
我已经开始使用 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:
并包括我自己的注册表。任何人都可以用一些代码帮助我吗?
我总是建议尽可能不要使用对象工厂,但是如果在某些情况下您需要访问容器并且无法通过构造函数注入或 属性 setter 注入它那么您的假设是正确的,即创建您自己的 ObjectFactory 实现是下一个最好的选择。
您的 link 参考资料是创建您自己的 ObjectFactory 的良好起点,从这里您需要做的就是像这样注册您的 StructureMap 注册表:
private static Container defaultContainer()
{
return new Container(x =>
{
x.AddRegistry<WebsiteRegistry1>();
x.AddRegistry<WebsiteRegistry2>();
});
}
如果您正在编写网站或 Web 应用程序 - 我假设您正在使用 ShortBus,那么另一种方法是使用 HttpContext
有界嵌套容器。这是您创建容器 (more on nested containers here) 的嵌套版本的地方,它存储在每个页面请求的 HttpContext
对象中。然后,您可以 return 一个使用静态实例的容器实例。
要了解如何做到这一点,我建议您看一下 Jimmy Bogard's ContosoUniversity rewrite here he does just this (see here for usage):
public class StructureMapValidatorFactory : ValidatorFactoryBase
{
public override IValidator CreateInstance(Type validatorType)
{
return StructuremapMvc.ParentScope.CurrentNestedContainer.TryGetInstance(validatorType) as IValidator;
}
}
希望对您有所帮助。如果您对此有任何疑问,我很乐意尽我所能帮助回答。
旁注: 如果您使用的是 ShortBus,我建议您也看看 Mediatr。它基于 ShortBus,但具有一些附加功能和更好的文档。