Инъекция зависимости - ваш друг. Как уже говорилось, выставьте зависимость через конструктор (который кажется типичным способом), или вы можете сделать это через внедрение свойства. В любом случае, когда вы регистрируете свою зависимость при запуске приложения, вы можете указать контейнеру сделать его одноэлементным, поэтому при запросе ссылки вы получаете тот же эффект, что и статическая ссылка.
Для Ninject синтаксис:
var kernel = new Ninject.StandardKernel(settings);
kernel.Bind<ISomeInterface>().To<MyConcreteObject>().InSingletonScope();
Для Unity синтаксис:
UnityContainer container = new UnityContainer();
container.RegisterType<ISomeInterface, MyConcreteObject>(new ContainerControlledLifetimeManager());
Так что ваши занятия могут быть примерно такими:
public class MyThing
{
ISomeInterface _mySingletonObject;
public MyThing(ISomeInterface mySingletonObject)
{
_mySingletonObject = mySingletonObject;
}
}
Этот класс всегда будет получать один и тот же экземпляр объекта, внедренный в него, при условии, что вы используете контейнер для разрешения экземпляра этого класса.
Опять же, для Ninject:
var singletopnObject = kernel.Get<ISomeInterface>();
И единство (думаю по памяти)
var singletopnObject = container.Resolve<ISomeInterface>();
И все другие контейнеры IoC предлагают одни и те же функции по-разному.
P.S. Статика не зло. Они быстрые и очень полезные при правильном использовании.