RegisterType与UnityContainer中的接口

Sha*_*dix 4 c# unity-container

我正在使用UnityContainer,我想注册一个不是类型的接口,而是使用另一个接口.不幸的是,我无法干净利落地做到这一点.

我有几个通用的接口,它们在一个接口中统一,我需要在容器中注册它们.代码如下:

interface IDeviceImporter {
    void ImportFromDevice();
}

interface IFileImporter {
    void ImportFromFile();
}

interface IImporter : IDeviceImporter, IFileImporter {
}


class Importer1: IImporter {
}
class Importer2: IImporter {
}
Run Code Online (Sandbox Code Playgroud)

进入库时,我知道要使用哪个导入器,因此代码如下:

var container = new UnityContainer();
if (useFirstImport) {
    container.RegisterType<IImporter, Importer1>();
} else {
    container.RegisterType<IImporter, Importer2>();
}
Run Code Online (Sandbox Code Playgroud)

然后我想用IDeviceImporter和IFileImporter注册这个特定的类.我需要这样的东西:

container.RegisterType<IDeviceImporter, IImporter>();
Run Code Online (Sandbox Code Playgroud)

但是那个代码我得到了一个错误: IImporter is an interface and cannot be constructed.

我可以在条件内完成,但那时它将是复制粘贴.我可以

container.RegisterInstance<IDeviceImporter>(container.Resolve<IImporter>());
Run Code Online (Sandbox Code Playgroud)

但它真的很脏.有人请,建议我:)

er-*_*r-v 6

那么这取决于您使用的生命周期管理的类型.这里:

  container.RegisterType<IImporter, Importer1>();
Run Code Online (Sandbox Code Playgroud)

你使用瞬态,所以你可以做到以下几点:

var container = new UnityContainer();

if (useFirstImport) {
    container.RegisterType<IImporter, Importer1>();
    container.RegisterType<IDeviceImporter, Importer1>();

} else {
    container.RegisterType<IImporter, Importer2>();
    container.RegisterType<IDeviceImporter, Importer2>();
}
Run Code Online (Sandbox Code Playgroud)

不用担心错误.container.Resolve<IImporter>()将在每次通话时创建新实例,就像container.Resolve<IDeviceImporter>()会一样.

但是,如果您正在使用,ContainerControlledLifetimeManager那么您将不得不使用,container.RegisterInstance<IDeviceImporter>(container.Resolve<IImporter>())因为Unity没有提供其他方法来执行此操作.

这个功能非常有趣,拥有类似的东西会非常好,container.CreateSymLink<IDeviceImporter, IImporter>()但是没有这样的东西.


Sha*_*dix 2

我正在使用 ContainerControlledLifetimeManager,最终得到如下代码:

var container = new UnityContainer();
System.Type importerType
if (useFirstImport) {
    importerType = GetType(Importer1);
} else {
    importerType = GetType(Importer2);
}

container.RegisterType(GetType(IImporter), importerType);
container.RegisterType(GetType(IDeviceImporter), importerType);
container.RegisterType(GetType(IFileImporter), importerType);
Run Code Online (Sandbox Code Playgroud)

但是,是的,最好的事情是拥有类似的东西:

container.CreateSymLink<IDeviceImporter, IImporter>()
Run Code Online (Sandbox Code Playgroud)