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

#c# #asp.net-mvc #entity-framework

#c# #asp.net-mvc #entity-framework

Вопрос:

У меня есть следующий интерфейс ISampleInterface

 public interface ISampleInterface
{
    bool sampleMethod(string _txt);
}
  

Итак, этот интерфейс я реализовал следующим образом,

 public Class SampleInterface : BaseEntity<Sample>, ISampleInterface
{
    IContext _context;

    public SampleInterface (IContext context) 
     : base(context)
    {
      _context = context;
    }

    public bool sampleMethod(string _txt)
    {
        return true;
    }
}
  

итак, из моего основного статического метода, как вызвать этот sampleMethod, не вызывая класс SampleInterface

мой класс обслуживания привязан к сущности, которая является «Образцом», поэтому я просто хочу знать, что без вызова класса обслуживания можно вызвать этот метод (sampleMethod) через ISampleInterface

 public static void main(String[] args) 
{ 
    
} 
  

Точная проблема, с которой я сталкиваюсь, у меня есть пакетное задание и веб-проект, веб-проект, я могу вызвать этот метод с помощью IOC addictive, также я хочу вызвать тот же метод в пакетном задании, я не могу, потому что основным методом batchjob является статический метод

Комментарии:

1. Итак, вы хотите вызвать метод экземпляра для класса без экземпляра указанного класса?

2. Вы не можете вызвать метод экземпляра без экземпляра!

3. @Gesso Это не имеет смысла. Чего вы пытаетесь достичь здесь?

4. Это проблема XY. Вы хотите что-то сделать, X, и вы думаете, что решение — Y, вызывая метод в интерфейсе без какого-либо экземпляра класса, реализующего этот интерфейс. Теперь вы спрашиваете, как сделать Y, но это просто невозможно. Интерфейс — это контракт, а не то, что вы можете вызвать. Вы можете вызвать его в классе, который реализует указанный интерфейс. Пожалуйста, объясните свой X или почему вы думаете, что вам это нужно. Статическая часть здесь — просто отвлекающий маневр, она не имеет значения.

5. @Gesso нет, вы действительно должны предоставить больше контекста, все еще слишком расплывчато. Да, ваш SampleInterface класс наследуется от BaseEntity<Sample> , если вам нужен класс, который реализует ISampleInterface , но не привязан Sample , вам нужно создать новый класс, который реализует этот интерфейс. Но почему? Если вы хотите вызвать метод, который находится внутри SampleInterface.sampleMethod() , вы должны создать экземпляр SampleInterface : new SampleInterface().sampleMethod() . Вы должны вызвать ISampleInterface.sampleMethod() экземпляр . Объясните, почему вы этого не хотите.

Ответ №1:

sampleMethod это метод экземпляра, поэтому вам нужен экземпляр. Невозможно вызвать его без него!

 public static void main(String[] args) 
{ 
    var instance = new SampleInterface();
    instance.sampleMethod("some text");
}
  

Ответ №2:

Вызов метода экземпляра без какого-либо экземпляра не имеет смысла в C #.

Это все равно, что просить выполнить числовое вычисление без числа.

Возможно, это связано с вашим контекстом: интерфейсы должны быть реализованы на уровне экземпляра, статических интерфейсов не существует. Хотя это и не совсем невозможно, это недоступно в C # по дизайну.

Итак, с экземплярами, для полноты ответа:

Для создания экземпляра используйте конструктор (поскольку вы не определили ни одного конструктора, неявно создается общедоступный конструктор без параметров по умолчанию)

Затем вы можете вызвать метод для экземпляра.

 var instance = new SampleInterface();
instance.someMethod("foo");
  

Комментарии:

1. Извините, я только что добавил подрядчика

2. То, что вы добавили, не компилируется, что это за частное поле _sample ? это не определено в классе.

3. Если у вас есть определенный конструктор, вам нужно вызвать соответствующий конструктор с new помощью . Если у вас есть какие-то параметры для передачи конструктору, вам нужно передать их, как при вызове функции new MyClassName(parameter1, parameter2)

4. На самом деле мой класс обслуживания привязан к объекту, который является «Образцом», интересно, может ли он вызывать без создания экземпляра

5. @Gesso чего ты пытаешься достичь? Какую проблему вы хотите решить?