Я бы предложил создать фабрику регистрации, если вы хотите зарегистрировать вещи в коде. Затем вы будете передавать фабрику регистрации через конструктор, и она будет регистрировать ваши объекты. Это позволит вам отделиться от Unity.
Итак:
public interface IRegistrationFactory
{
void RegisterInstance<TI,TO>();
void RegisterType<TI,TO>();
void RegisterInstance<TI,TO>(string name, TO objectToRegister);
}
public class COperations
{
private IRegistrationFactory _factory;
public COperations(IRegistrationFactory factory)
{
_factory= factory;
}
public void DoSomethingElse(string str)
{
// based on runtime values create an instance of class CA or CB and register them with the container
if (str.Length > 10)
_factory.RegisterInstance<CA,CA>("InstanceCA", new CA());
else
_factory.RegisterInstance<CB,CB>("InstanceCB", new CB());
}
вам, очевидно, нужно реализовать IRegistrationFactory. Все это будет класс, который принимает IUnityContainer в своем конструкторе, а затем реализует интерфейс.
Если вы решили перейти с Unity на другой контейнер DI, все, что вам нужно сделать, это настроить IRegistrationFactory для обработки нового контейнера DI.
Кроме того, если вы регистрируете экземпляры, вы можете сделать это следующим образом:
_container.RegisterType (new ContainerControlledLifetimeManager ());
это всегда будет возвращать один и тот же экземпляр объекта, поэтому он похож на RegisterInstance. Преимущество этого подхода в том, что Unity разрешит любую из зависимостей CA для вас, тогда как если вы используете RegisterInstance, вам придется сделать это вручную.