Можно ли внедрить внедрение зависимостей в проекты библиотеки Windows?

Можно ли внедрить внедрение зависимостей в проекты библиотеки Windows? Или этот шаблон проектирования не практикуется в библиотеках?


person bill    schedule 28.11.2019    source источник
comment
Что вы подразумеваете под библиотекой Windows?   -  person DavidG    schedule 28.11.2019


Ответы (2)


Вы, конечно, можете.

Microsoft, например, делает это со всеми своими библиотеками ASP.NET Core. Все они поддерживают внедрение зависимостей.

Важной частью простоты использования является уверенность в том, что библиотека знает, как подключать зависимости. Например, все библиотеки Microsoft предоставляют методы расширения для ServiceCollection, поэтому я могу написать serviceCollection.AddLibraryName(); вместо того, чтобы добавлять все необходимые классы самостоятельно.

person nvoigt    schedule 28.11.2019

Да, ты можешь. вы можете сделать ядро ​​​​Asp.net таким же, как формы Windows, без других библиотек, таких как autofac (если вы хотите использовать, вы также можете) и .net, например https://autofac.org/ вы можете зарегистрировать свои сервисы, репо, синглтоны.

    var builder = new ContainerBuilder();

// Register individual components
builder.RegisterInstance(new TaskRepository())
       .As<ITaskRepository>();
builder.RegisterType<TaskController>();
builder.Register(c => new LogManager(DateTime.Now))
       .As<ILogger>();

// Scan an assembly for components
builder.RegisterAssemblyTypes(myAssembly)
       .Where(t => t.Name.EndsWith("Repository"))
       .AsImplementedInterfaces();

var container = builder.Build();

ОБНОВЛЕНИЕ

    static class Program {
    private static Container container;

    [STAThread]
    static void Main() {

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Bootstrap();
        Application.Run(container.GetInstance<Form1>());
    }

    private static void Bootstrap() {
        // Create the container as usual.
        container = new Container();

        // Register your types, for instance:
        container.Register<IUserRepository, SqlUserRepository>(Lifestyle.Singleton);
        container.Register<IUserContext, WinFormsUserContext>();
        container.Register<Form1>();

        // Optionally verify the container.
        container.Verify();
    }
}

И мы можем использовать вот так.

   public partial class Form1 : Form {
    private readonly IUserRepository userRepository;
    private readonly IUserContext userContext;

    public Form1(IUserRepository userRepository, IUserContext userContext) {
        this.userRepository = userRepository;
        this.userContext = userContext;

        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
        if (this.userContext.IsAdministrator) {
            this.userRepository.ControlSomeStuff();
        }
    }
}
person Dharmeshsharma    schedule 30.11.2019
comment
stackoverflow.com/ вопросы/27763242/ - person Dharmeshsharma; 30.11.2019
comment
Куда мне написать вышеуказанный регистрационный код в библиотеке, где нет точки входа? - person bill; 20.12.2019
comment
@bill обнови мой код. вот так вы можете зарегистрировать свои репозитории и сервисы в классе запуска. - person Dharmeshsharma; 23.12.2019