gpt4 book ai didi

c# - 如何使用 StructureMap 将相同的接口(interface)映射到不同的 ConcreteClasses?

转载 作者:太空狗 更新时间:2023-10-29 21:06:52 24 4
gpt4 key购买 nike

创建 Controller1 时,我希望 IService 映射到 ConcreteService1,IPageService 映射到 ConcretePageService1

当创建 Controller2 时,我希望 IService 映射到 ConcreteService2,IPageService 映射到 ConcretePageService2

我如何初始化 ObjectFactory 以便上面的工作正常进行?

意思是当我以这种方式初始化 ObjectFactory 时:

 ObjectFactory.Initialize(x =>
{
x.For<IService>().Use<ConcreteService1>();
x.For<IPageService>().Use<ConcretePageService1>();
});

但是无论 Controller 类型如何,这总是将 ConcreteService1 映射到 IService 并将 ConcretePageService1 映射到 IPageService

public class Controller1 : Controller
{
public Controller1(IService service, IPageService pageService)
{
}
}

public class Controller2 : Controller
{
public Controller2(IService service, IPageService pageService)
{
}
}

public interface IService
{
}
public class ConcreteService1:IService
{
}
public class ConcreteService2:IService
{
}

public interface IPageService
{
}
public class ConcretePageService1:IPageService
{
}
public class ConcretePageService2:IPageService
{
}

最佳答案

如果它只是一个独立的注册,您可以使用命名实例将特定实例映射到每个 Controller 。

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"));

如果这是在应用程序中重复出现的模式,您应该使用 convention映射类型以避免所有这些重复。

可以使用内置约定添加由类型名称命名的类型。

Scan(x =>
{
x.AssembliesFromApplicationBaseDirectory();
x.AddAllTypesOf<IService>().NameBy(type => type.Name);
x.AddAllTypesOf<IPageService>().NameBy(type => type.Name);
x.WithDefaultConventions();
});

关于c# - 如何使用 StructureMap 将相同的接口(interface)映射到不同的 ConcreteClasses?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4992700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com