2017-01-10 35 views
0

Я пытаюсь понять, если мне нужно использовать .singleton() в моей структуре кода карты. вопрос об этом уже возник в stackoverflow (StructureMap singleton), но я хочу быть уверенным, что я определенно использую правильный синтаксис. Один из ответов следует, что если я возвращающий тип мне нужно использовать .singleton(), так что мой код здесь:Structuremap singleton use

  x.For<IApprovedProgrammesHelper>().Use<ApprovedProgrammesHelper>(); 
      x.For(typeof(ICache<>)) 
       .Use(typeof(CacheHelper<>)) 
       .Dependencies.Add(typeof(TimeSpan), Settings.Instance.HttpCacheExpiration); 

должен выглядеть следующим образом:

  x.For<IApprovedProgrammesHelper>().singleton().Use<ApprovedProgrammesHelper>(); 
      x.For(typeof(ICache<>)) 
       .Singleton() 
       .Use(typeof(CacheHelper<>)) 
       .Dependencies.Add(typeof(TimeSpan), Settings.Instance.HttpCacheExpiration); 

это правильно? Или я неправильно понял, как это должно работать? Я не совсем уверен, какие последствия для кода в любом случае. Вероятно, стоит упомянуть, что типы в операторе .Use <> не следуют шаблону singleton.

Спасибо за ваше время заранее Sam

+0

Только вы знаете, является ли это безопасно иметь * только один экземпляр * 'CacheHelper ' и 'ApprovedProgrammesHelper' или нет. Если он (или его зависимости) имеет какое-либо (изменяемое) состояние и не является потокобезопасным, то, вероятно, неразумно определять их как singleton. Никто не может ответить на этот вопрос для вас, не видя кода для обоих классов, их зависимостей и знания, в каком контексте (например, framework) этот код работает. – Steven

+0

@Steven, вы правы, мне потребовалось немного времени, чтобы понять, что его единственно реально можно сказать, подходит ли одноэлемент, если вы знаете детали соответствующих классов/интерфейсов. Ваше объяснение помогло осветить проблему для меня - использование singleton неверно или неверно, оно полностью зависит от контекста. Спасибо за вашу помощь. –

ответ

0

Ваше использование API Singleton является правильным, однако, не зная, что ваш код делает это трудно сказать, нужно ли делать это синглтон.

Добавив метод вызова Singleton(), вы сообщаете StructureMap, что хотите создать один экземпляр ICache<> с любыми другими запросами на объект, разрешающий один экземпляр.

Например, маркировка следующего класса, как одноэлементно всегда будет решать в дате и время быть тем же самым на свой первый вызов:

public class SingletonExample 
{ 

    private readonly DateTime _time; 

    public SingletonExample(){ 
     _time = DateTime.Now; 
    } 

    public DateTime GetDateTime() 
    { 
     return _time; 
    } 
} 
+0

спасибо за ваш ответ, я думаю, что мне нужно будет подробно изучить эти классы, прежде чем я смогу принять решение об использовании однопользовательского режима. Ваш пример помог мне понять, почему в некоторых случаях было бы неразумно использовать singleton. –

 Смежные вопросы

  • Нет связанных вопросов^_^