I'm using UnityContainer, and I want to register an interface not with a type, but with another interface. Unfortunately, I'm unable to do it cleanly..
I have several common interfaces, which are united in one interface, and I need to register them in the container. The code is like the following:
interface IDeviceImporter {
void ImportFromDevice();
}
interface IFileImporter {
void ImportFromFile();
}
interface IImporter : IDeviceImporter, IFileImporter {
}
class Importer1: IImporter {
}
class Importer2: IImporter {
}
When entering the library, I know which importer to use, so the code is like:
var container = new UnityContainer();
if (useFirstImport) {
container.RegisterType<IImporter, Importer1>();
} else {
container.RegisterType<IImporter, Importer2>();
}
and then I want to register this specific class with IDeviceImporter and IFileImporter also. I need something like:
container.RegisterType<IDeviceImporter, IImporter>();
But with that code I'm getting an error: IImporter is an interface and cannot be constructed
.
I can do it inside the condition, but then it'll be copy-paste. I can do
container.RegisterInstance<IDeviceImporter>(container.Resolve<IImporter>());
but it's really dirty. Anyone please, advice me something :)
Well this depends on the type of lifetime management you are using. Here:
container.RegisterType<IImporter, Importer1>();
you use transient one, so you can do the following:
var container = new UnityContainer();
if (useFirstImport) {
container.RegisterType<IImporter, Importer1>();
container.RegisterType<IDeviceImporter, Importer1>();
} else {
container.RegisterType<IImporter, Importer2>();
container.RegisterType<IDeviceImporter, Importer2>();
}
without fear of bugs. container.Resolve<IImporter>()
will create new instance on every call, just like container.Resolve<IDeviceImporter>()
will.
But if you are using ContainerControlledLifetimeManager
then anyway you'll have to use container.RegisterInstance<IDeviceImporter>(container.Resolve<IImporter>())
because Unity offers no other way to do this.
This feature is really interesting, it would be very nice to have something like container.CreateSymLink<IDeviceImporter, IImporter>()
but there is no such a thing.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With