C# 如何使用StructureMap将同一接口映射到不同的ConcreteClass?
创建Controller1时,我希望IService映射到ConcreteService1,IPageService映射到ConcretePageService1 当创建Controller2时,我希望IService映射到ConcreteService2,IPageService映射到ConcretePageService2 如何初始化ObjectFactory以使上述功能正常工作 当我以这种方式初始化ObjectFactory时:C# 如何使用StructureMap将同一接口映射到不同的ConcreteClass?,c#,structuremap,C#,Structuremap,创建Controller1时,我希望IService映射到ConcreteService1,IPageService映射到ConcretePageService1 当创建Controller2时,我希望IService映射到ConcreteService2,IPageService映射到ConcretePageService2 如何初始化ObjectFactory以使上述功能正常工作 当我以这种方式初始化ObjectFactory时: ObjectFactory.Initialize(x =&
ObjectFactory.Initialize(x =>
{
x.For<IService>().Use<ConcreteService1>();
x.For<IPageService>().Use<ConcretePageService1>();
});
查看StructureMap的ConstructedBy()语法 在本页上,但我不确定这些是否是SM的最新文档: 我对Constructedby的看法可能是错误的——文档不是很好。有关类似问题,请参见以下内容:
如果只是一个独立的注册,您可以使用命名实例将特定实例映射到每个控制器
For<IService>().Add<ConcreteService1>().Named("service1");
For<IService>().Add<ConcreteService2>().Named("service2");
For<IPageService>().Add<PageService1>().Named("pageService1");
For<IPageService>().Add<PageService2>().Named("pageService2");
For<Controller1>().Use<Controller1>()
.Ctor<IService>().Is(c => c.GetNamedInstance<IService>("service1"))
.Ctor<IPageService>().Is(
c => c.GetNamedInstance<IPageService>("pageService1"));
For<Controller2>().Use<Controller2>()
.Ctor<IService>().Is(
c => c.GetNamedInstance<IService>("service2"))
.Ctor<IPageService>().Is(
c => c.GetNamedInstance<IPageService>("pageService2"));
For().Add().Named(“service1”);
For().Add().Named(“service2”);
For().Add().Named(“pageService1”);
For().Add().Named(“pageService2”);
For().Use()
.Ctor()是(c=>c.GetNamedInstance(“service1”))
.Ctor()是(
c=>c.GetNamedInstance(“pageService1”);
For().Use()
.Ctor()是(
c=>c.GetNamedInstance(“service2”))
.Ctor()是(
c=>c.GetNamedInstance(“pageService2”);
如果这是一个在应用程序中重复的模式,那么应该使用映射来映射类型,以避免所有这些重复
可以使用内置约定添加按类型名称命名的类型
Scan(x =>
{
x.AssembliesFromApplicationBaseDirectory();
x.AddAllTypesOf<IService>().NameBy(type => type.Name);
x.AddAllTypesOf<IPageService>().NameBy(type => type.Name);
x.WithDefaultConventions();
});
扫描(x=>
{
x、 AssembliesFromApplicationBaseDirectory();
x、 AddAllTypesOf().NameBy(type=>type.Name);
x、 AddAllTypesOf().NameBy(type=>type.Name);
x、 使用默认约定();
});
我读过,但我不明白这是如何回答我的问题的,还是我遗漏了什么?谢谢,在国际海事组织,附加条件不是解决问题的办法。一项公约更有可能是一个持久的解决办法。谢谢你。StructureMap文档非常复杂,我找不到它。
Scan(x =>
{
x.AssembliesFromApplicationBaseDirectory();
x.AddAllTypesOf<IService>().NameBy(type => type.Name);
x.AddAllTypesOf<IPageService>().NameBy(type => type.Name);
x.WithDefaultConventions();
});