在创建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>();
});
Run Code Online (Sandbox Code Playgroud)
但是,这始终映射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
{
}
Run Code Online (Sandbox Code Playgroud)
PHe*_*erg 12
如果它只是一个独立的注册,您可以使用命名实例将特定实例映射到每个控制器.
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"));
Run Code Online (Sandbox Code Playgroud)
如果这是在应用程序中重复的模式,则应使用约定来映射类型以避免所有这些重复.
使用内置约定可以添加按类型名称命名的类型.
Scan(x =>
{
x.AssembliesFromApplicationBaseDirectory();
x.AddAllTypesOf<IService>().NameBy(type => type.Name);
x.AddAllTypesOf<IPageService>().NameBy(type => type.Name);
x.WithDefaultConventions();
});
Run Code Online (Sandbox Code Playgroud)