свойство singleinjector singleton - PullRequest
       5

свойство singleinjector singleton

1 голос
/ 04 апреля 2019

С помощью простого инжектора есть способ установить свойство или иметь параметр конструктора, который не является интерфейсом?

Мое приложение представляет собой UWP WebVew, и большинство служб зависят от него и его состояния.

Я создал обертку для нее, чтобы я мог внедрить ее во все сервисы следующим образом:

public interface IWebBrowser
{
    WebView WebView { get; set; }
}

public class WebBrowser : IWebBrowser
{
    public WebView WebView { get; set; }
}

public sealed partial class MainPage : Page
{

    public MainPage()
    {
        InitializeComponent();

        var Container = new Container();
        Container.Register<IWebBrowser, WebBrowser>(Lifestyle.Singleton);
        Container.Register<MainViewModel>();

        var web = Container.GetInstance<IWebBrowser>();
        web.WebView = WebView;

        Vm = Container.GetInstance<MainViewModel>();
    }
}

public class MainViewModel : ViewModelBase
{
    private readonly web;

    public MainViewModel(IWebBrowser web)
    {
        this.web = web;
    }
}

Это работает, но выглядит подверженным ошибкам. Есть ли способ сделать это без этих двух строк:

var web = Container.GetInstance<IWebBrowser>();
web.WebView = WebView;

1 Ответ

1 голос
/ 04 апреля 2019

Вы можете использовать RegisterInitializer, который немного более надежен

Регистрирует делегат Action<T>, который запускается после создания экземпляров, которые реализуют или наследуют отданный сервис.Обратите внимание, что только экземпляры, созданные контейнером (с использованием инжектора конструктора), могут быть инициализированы таким образом

container.RegisterInitializer<IWebBrowser>(x => o.WebView = WebView);

Примечание : хотя янемного смущен тем, что такое WebView и почему его нужно в любом случае тыкать.

...