C# 寄存器依赖统一

C# 寄存器依赖统一,c#,dependency-injection,dependencies,unity-container,C#,Dependency Injection,Dependencies,Unity Container,我只是想问一下,是否有一种方法可以使用unity以最简单的方式注册依赖项 public class Module : IModule { IUnityContainer _container; IRegionManager _regionManager; public Module (IUnityContainer container, IRegionManager regionManager) { _contai

我只是想问一下,是否有一种方法可以使用unity以最简单的方式注册依赖项

    public class Module : IModule
    {
        IUnityContainer _container;
        IRegionManager _regionManager;

    public Module (IUnityContainer container, IRegionManager regionManager)
    {
        _container = container;
        _regionManager = regionManager;
    }

    public void initialize()
    {
      IRegion region = _regionManager.Regions[RegionNames.ContentRegion];
       _container.RegisterType<"InterfaceHERE", "CLASSHERE">();
    }
我有30-40个类和接口,我不想把它编码成多余的。有没有办法用最简单的形式编写代码?比如获取所有类并创建一个循环并注册它


谢谢

自Unity 3.0以来,您可以使用约定在容器中注册实现。请,代码如下所示。您必须指定要自动注册的类型,如何选择映射,决定它们的名称和使用寿命

using (var container = new UnityContainer())
{
  container.RegisterTypes(
    AllClasses.FromLoadedAssemblies(),
    WithMapping.MatchingInterface,
    WithName.Default,
    WithLifetime.ContainerControlled);
}
如果您使用的是Unity 2.0,那么您必须使用其他软件包,请参阅nuget。使用此软件包,您可以扫描实现并自动注册它们,如下所示,有关详细信息,请查看项目文档:

public class FooRegistry : UnityRegistry
{

    (...)

    Scan(scan =>
    {
            scan.AssembliesInBaseDirectory();
            scan.ForRegistries();
            scan.With<FirstInterfaceConvention>();
            scan.With<AddAllConvention>()
                .TypesImplementing<IHaveManyImplementations>();
            scan.With<SetAllPropertiesConvention>().OfType<ILogger>();
            scan.ExcludeType<FooService>();
    });
}

如果您使用的是服务定位器模式,而不是实际的IoC,那么您可以使用公共构造函数对任何类型调用Resolve,Unity将发现它,而无需事先注册它。希望你真的在使用IoC。我认为它适用于v3.5及更高版本。我只有2.0好的,我更新了我的答案以涵盖Unity 2.0,祝你好运!如果我的帖子有帮助,请将其标记为答案,它将帮助其他人。安装unityconfiguration后,仍然找不到RegisterTypes扩展名:@EnricoDomingo RegisterTypes仅适用于Unity>=3.0,它是在那里构建的。对于UnityConfiguration包,流程有点不同,我已经从他们的文档中添加了代码,请查看他们的github。谢谢@Michałołnieruk!