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 months 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 (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-12-18T22:02:35.000Z (about 1 year ago)
- Last Synced: 2025-02-26T23:04:02.765Z (11 months ago)
- Topics: asynchronous, cmdlet, dependency-injection, powershell
- Language: C#
- Homepage: https://www.nuget.org/packages/Svrooij.PowerShell.DependencyInjection
- Size: 124 KB
- Stars: 7
- 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
});
}
}
```