Можно ли внедрить внедрение зависимостей в проекты библиотеки Windows? Или этот шаблон проектирования не практикуется в библиотеках?
Можно ли внедрить внедрение зависимостей в проекты библиотеки Windows?
Ответы (2)
Вы, конечно, можете.
Microsoft, например, делает это со всеми своими библиотеками ASP.NET Core. Все они поддерживают внедрение зависимостей.
Важной частью простоты использования является уверенность в том, что библиотека знает, как подключать зависимости. Например, все библиотеки Microsoft предоставляют методы расширения для ServiceCollection
, поэтому я могу написать serviceCollection.AddLibraryName();
вместо того, чтобы добавлять все необходимые классы самостоятельно.
Да, ты можешь. вы можете сделать ядро 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();
}
}
}