我使用Unity进行依赖注入。我有很多以文本结尾的课程" Mapper"例如
HomeMapper
,ContactMapper
,EmployeeMapper
目前我正在将这些类注册为Unity
conatiner.RegisterType<HomeMapper>;
conatiner.RegisterType<ContactMapper>;
conatiner.RegisterType<EmployeeMapper>;
我想使用Unity的自动注册功能来注册所有以&#34; Mapper&#34;结尾的课程。那是在某些集会中。
我已经添加了对`Unity.AutoRegistration.dll&#39;的引用汇编,但我正在寻找语法?
更新1
public class HomeMapper
{
private readonly MyService _service;
public HomeMapper(MyService service)
{
_service = service;
}
public MyModel Map(MyEntity entity)
{
// do mapping here
}
}
我可以将HomeMapper
注册为Singleton吗?请注意,它需要MyService
实例作为构造函数参数,MyService
注册为
container.RegisterType<MyService, MyService>();
答案 0 :(得分:1)
使用Unity do not need to register 具体类(与新的ASP.NET核心依赖注入框架不同,其中所有registrations need to be explicit)。以下测试成功创建了HomeController
的实例,该实例接收HomeMapper
作为依赖项:
public class ResolveControllerTest
{
[Xunit.Fact]
public void ResolveHomeControllerWithoutRegistration()
{
var container = new UnityContainer();
var controller = container.Resolve<HomeContoller>();
Assert.NotNull(controller); // pass
}
}
public class HomeContoller
{
public HomeContoller(HomeMapper mapper)
{
}
}
public class HomeMapper
{
}
您可能想要注册具体的类,例如,当您需要自定义生命周期时。
编辑:
假设映射器是无状态,所有以&#34; Mapper&#34;结尾的类可以注册为单身人士:
var container = new UnityContainer();
container.RegisterTypes(
AllClasses.FromLoadedAssemblies()
.Where(t => t.Name.EndsWith("Mapper")),
WithMappings.None,
WithName.Default,
WithLifetime.ContainerControlled);
// controllers are 'transient' - new instance per resolve
var controller1 = container.Resolve<HomeContoller>();
var controller2 = container.Resolve<HomeContoller>();
// mapper is a singleton. Same instance returned
var mapper1 = container.Resolve<HomeMapper>();
var mapper2 = container.Resolve<HomeMapper>();