Fran_gg7
Fran_gg7

Reputation: 737

Dependency Injection in ViewModelBase - Best practice

I am using a LoggerService in my ViewModelBase, which is injected in constructor:

public abstract class ViewModelBase : INotifyPropertyChanged
{
    private ILoggerService _loggerService;

    public ViewModelBase(ILoggerService loggerService)
    {
       _loggerService = loggerService;
    }

    ...
    ...

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

But in my ViewModelOne, which inherits from ViewModelBase, I need to use this service, what should I do?

In your opinion, which would be the best approach? Or...what would you do?

Upvotes: 0

Views: 195

Answers (2)

jtabuloc
jtabuloc

Reputation: 2535

Make your ILoggerService protected and readonly so that only base class can assign value on it.

protected readonly ILoggerService _loggerService;

Refrain from doing it public so that you only know one place to check it and only one class has responsible on it, which is your base class.

Upvotes: 1

Weibo Li
Weibo Li

Reputation: 3605

You don't have to inject ILoggerService twice. Change the _loggerService from private to protected as following:

private ILoggerService _loggerService;

Or declare a getLoggerService in the supper class and then call it to get the logger instance in subclass:

protected ILoggerService getLoggerService() {
  return _loggerService;
}

Note that it makes no sense for other classes to get logger service from ViewModelBase, so it's better to declare getLoggerService as protected.

Upvotes: 2

Related Questions