团结

时间:2017-02-15 16:50:13

标签: dependency-injection unity-container

我使用Unity进行依赖注入。我有很多以文本结尾的课程" Mapper"例如

HomeMapperContactMapperEmployeeMapper

目前我正在将这些类注册为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>();

1 个答案:

答案 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>();
相关问题