【发布时间】:2009-09-30 17:03:58
【问题描述】:
根据登录用户的类型,我的 Web 应用在业务逻辑和表示逻辑上有一些细微的变化。通过基于用户类型注入不同的具体类来获得变化似乎非常适合 DI。所以我想知道我应该使用 StructureMap 的哪些功能来实现这一点(或者我是否偏离了 DI 的目的)。
(我刚刚了解到 Profiles 不是实现此目的的方法,因为设置 Profile 不是每个线程的操作:Are StructureMap profiles thread safe?)
编辑
这是解决这个问题的方法吗?
public class HomeController
{
private ISomeDependancy _someDependancy;
public HomeController(ISomeDependancy someDependancy)
{
_someDependancy = someDependancy;
}
public string GetNameFromDependancy()
{
return _someDependancy.GetName();
}
}
public interface ISomeDependancy
{
string GetName();
}
public class VersionASomeDependancy : ISomeDependancy
{
public string GetName()
{
return "My Name is Version A";
}
}
public class VersionBSomeDependancy : ISomeDependancy
{
public string GetName()
{
return "My Name is Version B";
}
}
public class VersionARegistry : Registry
{
public VersionARegistry()
{
// build up complex graph here
ForRequestedType<ISomeDependancy>().TheDefaultIsConcreteType<VersionASomeDependancy>();
}
}
public class VersionBRegistry : Registry
{
public VersionBRegistry()
{
// build up complex graph here
ForRequestedType<ISomeDependancy>().TheDefaultIsConcreteType<VersionBSomeDependancy>();
}
}
public class ContainerA : Container
{
public ContainerA()
: base(new VersionARegistry())
{
}
}
public class ContainerB : Container
{
public ContainerB()
: base(new VersionBRegistry())
{
}
}
[TestFixture]
public class Harness
{
[Test]
public void ensure_that_versions_load_based_on_named_containers()
{
ObjectFactory.Initialize(c =>
{
c.ForRequestedType<IContainer>().AddInstances(
x =>
{
x.OfConcreteType<ContainerA>().WithName("VersionA");
x.OfConcreteType<ContainerB>().WithName("VersionB");
}).CacheBy(InstanceScope.Singleton);
});
HomeController controller;
IContainer containerForVersionA = ObjectFactory.GetNamedInstance<IContainer>("VersionA");
controller = containerForVersionA.GetInstance<HomeController>();
Assert.That(controller.GetNameFromDependancy(), Is.EqualTo("My Name is Version A"));
IContainer containerForVersionB = ObjectFactory.GetNamedInstance<IContainer>("VersionB");
controller = containerForVersionB.GetInstance<HomeController>();
Assert.That(controller.GetNameFromDependancy(), Is.EqualTo("My Name is Version B"));
}
}
【问题讨论】:
标签: .net design-patterns dependency-injection structuremap