Работа в общем коде в разных классах

ZSharp

Client
Регистрация
29.09.2013
Сообщения
395
Благодарностей
126
Баллы
43
Всем доброго времени.
Пытаюсь написать проект в общем коде.

Создаю


Общий код:
namespace OwnCodes
{
    class OwnClass
    {
        internal IZennoPosterProjectModel project;
        
        public OwnClass (IZennoPosterProjectModel _project)
        {
            project = _project;
        }
        
        
        // Старт проекта
        public void Starter()
        {
            LogInfo("Начинаем выполнение проекта"); // ок

            Method1(); // ок
            
            DB.DbCreate(); //ошибка
        }
        
        
        // Расширенный лог
        public void LogInfo(string message)
        {
            project.SendInfoToLog(message, true);
            // Сохранение или не сохранение лога в файл и другой код
        }

        
        // Какой-то метод
        void Method1()
        {
            LogInfo("Выполнен метод Method1");
        }
    }   


    class DB
    {
        public static void DbCreate()
        {
            // Код ....
            OwnClass.LogInfo("Таблица создана!"); // ОШИБКА
        }
    }   
}
В кубике создаю объект и запускаю выполнение всего проекта
Свой C# код:
OwnCodes.OwnClass starter = new OwnCodes.OwnClass(project);

starter.Starter();
Как запустить лог в другом классе?
Ругается на project
Компиляция кода проекта Ошибка при компиляции общего кода "CS0120" "Для нестатического поля, метода или свойства "OwnCodes.OwnClass.project" требуется ссылка на объект".

В классе DB создать экземпляр класса OwnClass тоже нельзя, так как не откуда передать project.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
Как запустить лог в другом классе?
Как в собственном примере - передав project в конструктор (и в нём уже в свойство) или сразу в метод, заранее создав параметр под IZennoPosterProjectModel.
Если по какой-то причине, необходимы без параметров, то только смотреть в сторону ThreadLocal, ThreadStatic.
 
  • Спасибо
Реакции: ZSharp

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

ZSharp

Client
Регистрация
29.09.2013
Сообщения
395
Благодарностей
126
Баллы
43
Как в собственном примере - передав project в конструктор (и в нём уже в свойство) или сразу в метод, заранее создав параметр под IZennoPosterProjectModel.
Но ведь тогда мне и метод LogInfo нужно дублировать в классе DB.


DB.DbCreate(project); передаст project

public static void DbCreate( IZennoPosterProjectModel project) принимает project
Это работает, только если лог в методе вызывать как
project.SendInfoToLog("message");
А если вызывать через
OwnClass.LogInfo("message");
То не работает (


Если по какой-то причине, необходимы без параметров, то только смотреть в сторону ThreadLocal, ThreadStatic.
Пойду гуглить эти страшные для меня слова )

P.S. В старпосте забыл написать. Что это ещё и нужно в многопотоке, и будет не только лог, а и всё остальное )
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113

ZSharp

Client
Регистрация
29.09.2013
Сообщения
395
Благодарностей
126
Баллы
43
Понял свою ошибку. Спасибо.
При создании объекта сыпались ошибки, так как я объект пытался создать внутри класса DB (типа один на всех), а не внутри каждого метода.

Если создавать объект в каждом методе, тогда всё работает.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
При создании объекта сыпались ошибки, так как я объект пытался создать внутри класса DB (типа один на всех), а не внутри каждого метода.
Если создавать объект в каждом методе, тогда всё работает.
Как раз таки, было правильно создавать в классе 1 на всех. Создание объекта в каждом методе, в будущем приведёт к потере производительности и возможно утечкам.
C#:
class DB
{
    private readonly OwnClass _ownClass;

    public DB(OwnClass ownClass)
    {
        _ownClass = ownClass;
    }

    // public DB(IZennoPosterProjectModel project)
    // {
    //     _ownClass = new OwnClass(project);
    // }

    public void DbCreate()
    {
        // Код ....
        _ownClass.LogInfo("Таблица создана!");
    }
}
 
  • Спасибо
Реакции: ZSharp

ZSharp

Client
Регистрация
29.09.2013
Сообщения
395
Благодарностей
126
Баллы
43
Как раз таки, было правильно создавать в классе 1 на всех. Создание объекта в каждом методе, в будущем приведёт к потере производительности и возможно утечкам.
C#:
class DB
{
    private readonly OwnClass _ownClass;

    public DB(OwnClass ownClass)
    {
        _ownClass = ownClass;
    }

    // public DB(IZennoPosterProjectModel project)
    // {
    //     _ownClass = new OwnClass(project);
    // }

    public void DbCreate()
    {
        // Код ....
        _ownClass.LogInfo("Таблица создана!");
    }
}
Не пойму как теперь вызвать метод DbCreate()?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
  • Спасибо
Реакции: ZSharp

ZSharp

Client
Регистрация
29.09.2013
Сообщения
395
Благодарностей
126
Баллы
43
Я правильно понимаю?
C#:
public void Starter()
{
    OwnClass ownClass = new OwnClass(project);
    
    DB db = new DB(ownClass);
    
    db.DbCreate();
}
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
  • Спасибо
Реакции: ZSharp

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)