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)
但它真的很脏.有人请,建议我:)
那么这取决于您使用的生命周期管理的类型.这里:
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>()但是没有这样的东西.
我正在使用 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)
| 归档时间: |
|
| 查看次数: |
13733 次 |
| 最近记录: |