C#C
C#14mo ago
Shock

Dependency Injection returning null value

I've created a WPF application that uses DI for the View/Viewmodel. I'm attempting to create a CS file to deal with the program logic that uses a dependency injected Service Wrapper. However, whenever I call the Service in the new class, the value is returning as null. I've included a shortened version below that hopefully gets the point across.

MyService.CS
public class CustomWrapper : ICustomWrapper
  {
    public Connect () {}
    public Disconnect () {}
  }
public interface ICustomWrapper
{
public Connect(string);
public Disconnect();
}

MainWindow.xaml.cs
public partial class MainWindow : Window
{
  public static string radioParse {get; set;}
  private readonly ICustomWrapper _customWrapper;
  public MainWindow (ICustomWrapper customWrapper)
  {
    _customWrapper = customWrapper;
    InitializeComponent();
  }

  public void Proceed_Click(object sender, RoutedEventArgs e)
  {
    var radioButton = Session.Children.OfType<RadioButton>()
          .FirstOrDefault(r=> r.IsChecked.HasValue && r.IsChecked.Value);
    if (radioButton == null)
      MessageBox.Show("Select an Option");
    else if (radioButton != null)
      { 
        radioParse = "A"
        SelectValue();
      }
    }
  public void SelectValue();
    {
      _customWrapper.Connect(radioParse)
    }

MainWindow.Xaml
<StackPanel>
<Button Content = "Proceed"
        Command = "{Binding Path=NavigateHomeCommand}
        Click = "Proceed_Click"/>
</StackPanel>


MainViewModel.cs
private ICustomWrapper _customWrapper;
public RelayCommand NavigateHomeCommand
public MainViewModel(INavigationService navigationService, ICustomWrapper customWrapper)
{
NavigateHomeCommand = new RelayCommand (o=> {Navigation.NavigateTo<HomeViewModel>(); } o=> true;
}

App.xaml
<DataTemplate DataType = "{x:Type TypeName=viewModel:HomeViewModel}">
<view:HomeView/>
</DataTemplate>

App.Xaml.Cs
public partial class App : Application
{
  private readonly IServiceProvider _serviceProvider;
  private readonly IService Collection services = new ServiceCollection();
{
public App
{
services = new ServiceCollection();
services.AddSingleton<MainWindow>(s =>
{
  var window = new mainWindow(s.GetRequiredService<ICustomWrapper>());
  window.DataContext = s.GetRequiredService<MainViewModel>();
  return window;
});
services.AddSingleton<MainViewModel>();
services.AddSingleton<HomeViewModel>();
services.AddSingleTon<INavigationService, navigationService>(); 
services.AddSingleTon<ICustomWrapper, customWrapper>(); 
services.AddSingleton<Func<Type, ViewModelBase>>(serviceProvider => viewModelType => (ViewModelBase)serviceProvider.GetRequiredService(viewModelType));
_serviceProvider = services.BuildServiceProvider();
}

protected override void ONstartup(StartupEventArgs e)
{
  MainWindow = _serviceProvider.GetRequiredService<MainWindow>();
  MainWindow.Show();
  base.OnStartup(e);
}
There is a lot more there, but they are all instantiated as singleton.
HomeView.xaml.Cs
public partial HomeView : UserControl
{
  private readonly ICustomWrapper _customWrapper;
  private readonly MainWindow mainWindow;

  public HomeView(ICustomWrapper customWrapper, MainWindow mainWindow)
  {
    _mainWindow = mainWindow
    customWrapper = customWrapper
  }
  private HomeView()
  {
    InitializeComponent();
  }
  private void Button1_Click(object sender, RoutedEventArgs e)
  {
    Logic _logic = new Logic(_customWrapper, _mainWindow);
    _logic.Select();
  }
}

And finally.

Logic.CS
public class Logic
{
  private readonly ICustomWrapper _customWrapper;
  private readonly MainWindow _mainWindow
  public string connectLetter = Mainwindow.radioParse;
  
  public Logic(ICustomWrapper customWrapper, MainWindow mainWindow)
  {
    _MainWindow = mainWindow;
    _customWrapper = customWrapper;
  }
  public void Select()
  {
    _customWrapper.Disconnect();
  ]
Was this page helpful?