Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/svrooij/powershell.dependencyinjection
Asynchronous PsCmdLet with Dependency Injection and ILogger
https://github.com/svrooij/powershell.dependencyinjection
asynchronous cmdlet dependency-injection powershell
Last synced: 11 days ago
JSON representation
Asynchronous PsCmdLet with Dependency Injection and ILogger
- Host: GitHub
- URL: https://github.com/svrooij/powershell.dependencyinjection
- Owner: svrooij
- License: mit
- Created: 2024-01-10T17:20:20.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2024-05-05T10:45:46.000Z (6 months ago)
- Last Synced: 2024-10-11T14:13:56.920Z (27 days ago)
- Topics: asynchronous, cmdlet, dependency-injection, powershell
- Language: C#
- Homepage: https://www.nuget.org/packages/Svrooij.PowerShell.DependencyInjection
- Size: 88.9 KB
- Stars: 6
- Watchers: 2
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# Svrooij.PowerShell.DependencyInjection
A library that allows you to use dependency injection in binary PowerShell modules.
- Dependency injection (based on Microsoft.Extensions.DependencyInjection)
- Using `ILogger` throughout your PowerShell Module.
- Run any asynchronous code in your commandlets.I choose to only support a Task, I guess that all code that you're executing using this package will by async anyway.
## Create a new PowerShell module
```shell
# Install the correct template (only once)
dotnet new install Microsoft.PowerShell.Standard.Module.Template# Create a new directory and enter it
mkdir MyNewModule
cd MyNewModule# Create a new PowerShell module
dotnet new psmodule
```## Add Package
Add the pacakge `dotnet add package Svrooij.PowerShell.DependencyInjection`
## Edit project file
Add the `CopyLocalLockFileAssemblies` to your project file, this will make sure that the dependencies are copied to the output folder.
```xml
netstandard2.0
Svrooij.PowerShell.DependencyInjection.SamplePs5
true
```And change the version of `PowerShellStandard.Library` to `5.1.1`.
```xml
```## Create a Startup class
```csharp
using Microsoft.Extensions.DependencyInjection;
using Svrooij.PowerShell.DependencyInjection;public class Startup : PsStartup
{
// You need to override this method.
public override void ConfigureServices(IServiceCollection services)
{
services.AddTransient();
}
}
```## Create a CmdLet
1. Instead of inheriting from `PsCmdLet`, you need to inherit `DependencyCmdlet`.
2. And then you put the `[ServiceDependency]` attribute above every private (or internal), field or property you want loaded from dependency injection.
3. Override the `Task ProcessRecordAsync(CancellationToken cancellationToken)` method and call all the async stuff you want.```csharp
[Cmdlet(VerbsDiagnostic.Test, "SampleCmdlet")]
[OutputType(typeof(FavoriteStuff))]
public class TestSampleCmdletCommand : DependencyCmdlet
{
[Parameter(
Mandatory = true,
Position = 0,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true)]
public int FavoriteNumber { get; set; }[Parameter(
Position = 1,
ValueFromPipelineByPropertyName = true)]
[ValidateSet("Cat", "Dog", "Horse")]
public string FavoritePet { get; set; } = "Dog";// Give your dependencies the ServiceDependency attribute
[ServiceDependency]
private ITestService TestService { get; set; }// Logging using Microsoft.Extensions.Logging is supported (and configured automatically)
// You can alse use the regular WriteVerbose(), WriteDebug(), WriteInformation(), WriteWarning() and WriteError() methods
[ServiceDependency]
private ILogger _logger;// This method will be called automatically by DependencyCmdlet which is called by ProcessRecord()
public override async Task ProcessRecordAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Starting ProcessRecordAsync()");await TestService.DoSomethingAsync(cancellationToken);
WriteObject(new FavoriteStuff
{
FavoriteNumber = this.FavoriteNumber,
FavoritePet = this.FavoritePet
});
}
}
```