2015-07-06 4 views
0

Я столкнулся со следующей ситуацией. В моем проекте много файлов классов, и по мере развития проекта создавались новые функции, но без правильного обзора кода. Итак, у нас есть некоторые дублированные объекты (для доступа к базе данных, например, к контроллеру), создаваемые вокруг одного и того же класса, но мы не знаем, лучше ли создавать только один глобальный объект или если мы должны оставить их внутри функции, потому что иногда код не достигает этой функции, поэтому объект никогда не будет создан. Если он глобальный, он будет создан каждый раз.Правильное место для объявления объекта в C#

Пример:

namespace EventWorks.View 
{ 
    public partial class Event : System.Web.UI.Page, ISecurityRules 
    { 
     protected void btnNew_Click(object sender, EventArgs e) 
     { 
      EventController EventCtrl = new EventController(); 

      //some code 
     } 

     protected void btnSave_Click(object sender, EventArgs e) 
     { 
      EventController EventCtrl = new EventController(); 

      //some code 
     } 
    } 
} 

Мой вопрос, где я должен создавать эти объекты? Лучше создать его во всем мире? Или оставить его внутри функции и позволить сборщику мусора позаботиться об этом? Или сделать большой анализ и проверить для каждого файла, какой вариант лучше?

ответ

4

где я должен создавать эти объекты?

Это действительно зависит от ответственности объекта, соображений безопасности потоков (если таковые имеются) и стоимости создания такого глобального члена. Нет «да сделать это глобально» решение всех ваших проблем. Вы должны обязательно проанализировать всех своих членов и решить для каждого из них, если это нормально, чтобы сделать их доступными на глобальном уровне и какие последствия он будет иметь для вашей системы. Например, сохранение DbContext в памяти в качестве единственного экземпляра считается плохой практикой, поскольку оно не является потокобезопасным.

Если вы беспокоитесь только о ненужных объектах создаются, вы всегда можете использовать Lazy<T> класс, который будет убедиться, что значение только лениво инициализируются на первый доступе:

private readonly Lazy<EventController> eventController = new 
       Lazy<EventController>(x => new EventController(), isThreadSafe: true); 
1

Если используются в нескольких функциях он может быть объявлен на уровне класса, как это (то не глобальное, но уровень класса):

namespace EventWorks.View 
{ 
    public partial class Event : System.Web.UI.Page, ISecurityRules 
    { 
     EventController _eventController = new EventController(); 

     protected void btnNew_Click(object sender, EventArgs e) 
     { 
      _eventController.DoSomething(); 
     } 

     protected void btnSave_Click(object sender, EventArgs e) 
     { 
      _eventController.DoSomething(); 
     } 
    } 
} 

это может быть initiliased в конструкторе также, или он может быть введен с помощью инъекции зависимостей (Constructor, интерфейс, сеттер инъекции) , Я думаю, все зависит от того, чего вы хотите.

1

Часто контроллер сохраняет информацию о статусе объекта. I.e, является ли объект новым или он был загружен из БД, имеет ли он ожидающие изменения или нет и так далее.

Поэтому представляется логичным иметь контроллер, который имеет тот же срок службы, что и объект (он будет создан один раз для каждого объекта).

Если контроллер не хранит какие-либо объекты, зависящие от объекта, он может быть создан один раз за время жизни приложения. В этом случае вы можете сделать это синглтон.

public class EventController 
{ 
    public static readonly EventController Instance = new EventController(); 

    private EventController() 
    { 
     // Make constuctor private, so the class cannot be instantiated elsewhere. 
    } 

    // Implement functionality here... 
} 

вызов это так:

EventController.Instance.DoSomething(); 
+0

это статическая декларация, не синглтон, синглтон является альтернативой статической –

+0

Существуют различные способы реализации одиночек. Дело в том, что у вас есть нестатический класс, который создается только один раз. Даже если вы реализуете его с помощью контейнера IOC, вам понадобится статический доступ к этому контейнеру.Там должно быть что-то статическое, что позволяет вам получить доступ к синглтону. –

+0

точно, однако в вашем примере, u ничего не сделал, как singleton ... любая из 4 наиболее распространенных реализаций его –

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