Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions vb2ae.ServiceLocator.MSDependencyInjection.Tests/Models/Cat.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace vb2ae.ServiceLocator.MSDependencyInjection.Tests.Models
{
public class Cat : IPet
{
public string Speak()
{
return "Meow";
}
}
}
10 changes: 10 additions & 0 deletions vb2ae.ServiceLocator.MSDependencyInjection.Tests/Models/Dog.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace vb2ae.ServiceLocator.MSDependencyInjection.Tests.Models
{
public class Dog : IPet
{
public string Speak()
{
return "Bark";
}
}
}
22 changes: 22 additions & 0 deletions vb2ae.ServiceLocator.MSDependencyInjection.Tests/Models/ICar.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
namespace vb2ae.ServiceLocator.MSDependencyInjection.Tests.Models
{
public interface ICar
{
string Name { get; set; }
}

public class Ford : ICar
{
public string Name { get; set; } = "Ford";
}

public class Toyota : ICar

Check notice on line 13 in vb2ae.ServiceLocator.MSDependencyInjection.Tests/Models/ICar.cs

View check run for this annotation

codefactor.io / CodeFactor

vb2ae.ServiceLocator.MSDependencyInjection.Tests/Models/ICar.cs#L13

File may only contain a single type. (SA1402)
{
public string Name { get; set; } = "Toyota";
}

public class Chevy : ICar

Check notice on line 18 in vb2ae.ServiceLocator.MSDependencyInjection.Tests/Models/ICar.cs

View check run for this annotation

codefactor.io / CodeFactor

vb2ae.ServiceLocator.MSDependencyInjection.Tests/Models/ICar.cs#L18

File may only contain a single type. (SA1402)
{
public string Name { get; set; } = "Chevy";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace vb2ae.ServiceLocator.MSDependencyInjection.Tests.Models
{
public interface IPet
{
string Speak();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace vb2ae.ServiceLocator.MSDependencyInjection.Tests.Models
{
public interface IService
{
void DoSomething();
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
namespace vb2ae.ServiceLocator.MSDependencyInjection.Tests
namespace vb2ae.ServiceLocator.MSDependencyInjection.Tests.Models
{
public interface IService
{
void DoSomething();
}

public class ServiceImpl : IService
{
public void DoSomething()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,100 @@
using Microsoft.Extensions.DependencyInjection;
using vb2ae.ServiceLocator.MSDependencyInjection.Tests.Models;

namespace vb2ae.ServiceLocator.MSDependencyInjection.Tests
{
public class ServiceLocatorTests
public class MSDependencyInjectionServiceLocatorTests
{
private readonly IServiceProvider _serviceProvider;

public MSDependencyInjectionServiceLocatorTests(IServiceProvider serviceProvider)

Check warning on line 10 in vb2ae.ServiceLocator.MSDependencyInjection.Tests/ServiceLocatorTests.cs

View workflow job for this annotation

GitHub Actions / build

Fixture argument 'serviceProvider' does not have a fixture source (if it comes from a collection definition, ensure the definition is in the same assembly as the test) (https://xunit.net/xunit.analyzers/rules/xUnit1041)

Check warning on line 10 in vb2ae.ServiceLocator.MSDependencyInjection.Tests/ServiceLocatorTests.cs

View workflow job for this annotation

GitHub Actions / build

Fixture argument 'serviceProvider' does not have a fixture source (if it comes from a collection definition, ensure the definition is in the same assembly as the test) (https://xunit.net/xunit.analyzers/rules/xUnit1041)
{
_serviceProvider = serviceProvider;
}

[Fact]
public void GetAllInstances_Type_ReturnsInstances()
{

Check notice on line 17 in vb2ae.ServiceLocator.MSDependencyInjection.Tests/ServiceLocatorTests.cs

View check run for this annotation

codefactor.io / CodeFactor

vb2ae.ServiceLocator.MSDependencyInjection.Tests/ServiceLocatorTests.cs#L17

An opening brace should not be followed by a blank line. (SA1505)

var result = CommonServiceLocator.ServiceLocator.Current.GetAllInstances(typeof(IService));

Assert.Single(result);
}
[Fact]
public void GetAllInstances_Type_ReturnsInstancesWhenKeyIsUsed()
{

Check notice on line 25 in vb2ae.ServiceLocator.MSDependencyInjection.Tests/ServiceLocatorTests.cs

View check run for this annotation

codefactor.io / CodeFactor

vb2ae.ServiceLocator.MSDependencyInjection.Tests/ServiceLocatorTests.cs#L25

An opening brace should not be followed by a blank line. (SA1505)

var result = CommonServiceLocator.ServiceLocator.Current.GetAllInstances(typeof(IPet));

Assert.Equal(2, result.Count());
}
[Fact]
public void GetAllInstances_Generic_ReturnsInstances()
{
var result = CommonServiceLocator.ServiceLocator.Current.GetAllInstances<ICar>();

Assert.Equal(3, result.Count());
}

[Fact]
public void GetAllInstances_Generic_ReturnsInstancesWithKey()
{
var result = CommonServiceLocator.ServiceLocator.Current.GetAllInstances<IPet>();

Assert.Equal(2, result.Count());
}

[Fact]
public void GetInstance_Type_ReturnsInstance()
{
var serviceType = typeof(IService);

var result = CommonServiceLocator.ServiceLocator.Current.GetInstance(serviceType);

Assert.True(result is ServiceImpl);
}

[Fact]
public void GetInstance_Type_WithKey()
{
var serviceType = typeof(IPet);
var key = "Cat";

Assert.True(CommonServiceLocator.ServiceLocator.Current.GetInstance(serviceType, key) is Cat);
}

[Fact]
public void GetInstance_Generic_ReturnsInstance()
{
var result = CommonServiceLocator.ServiceLocator.Current.GetInstance<IService>();

Assert.True(result is IService);
}

[Fact]
public void GetInstance_Generic_WithKey()
{
var key = "Dog";

Assert.True(CommonServiceLocator.ServiceLocator.Current.GetInstance<IPet>(key) is Dog);
}

[Fact]
public void GetService_Generic_ReturnsService()
{
var result = CommonServiceLocator.ServiceLocator.Current.GetService<IService>();

Assert.True(result is IService);
}

[Fact]
public void VerifyServiceLocatorCanLoadClass()
public void GetService_Type_ReturnsService()
{
var service = CommonServiceLocator.ServiceLocator.Current.GetInstance<IService>();
Assert.NotNull(service);
var serviceType = typeof(IService);

var result = CommonServiceLocator.ServiceLocator.Current.GetService(serviceType);

Assert.True(result is IService);
}
}
}
}
8 changes: 6 additions & 2 deletions vb2ae.ServiceLocator.MSDependencyInjection.Tests/Setup.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using vb2ae.ServiceLocator.MSDependencyInjection.Tests.Models;

namespace vb2ae.ServiceLocator.MSDependencyInjection.Tests
{
Expand All @@ -23,8 +24,11 @@ private IServiceProvider Build()
_defaultBuilder.ConfigureServices((context, services) =>
{
services.AddSingleton<IService, ServiceImpl>();
// where ServiceImpl implements IService
// ... add other services when needed
services.AddTransient<ICar, Ford>();
services.AddTransient<ICar, Toyota>();
services.AddTransient<ICar, Chevy>();
services.AddKeyedTransient<IPet, Dog>("Dog");
services.AddKeyedTransient<IPet, Cat>("Cat");
});

_services = _defaultBuilder.Build().Services;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,34 @@ public MSDependencyInjectionServiceLocator(IServiceProvider serviceProvider)

public IEnumerable<object> GetAllInstances(Type serviceType)
{
return _serviceProvider.GetServices(serviceType);
var allServices = new List<object>();
var services = _serviceProvider.GetServices(serviceType);
if (services != null)
{
allServices.AddRange(services);
}
var keyedServices = _serviceProvider.GetKeyedServices(serviceType, KeyedService.AnyKey);
if (keyedServices != null)
{
allServices.AddRange(keyedServices);
}
return allServices;
}

public IEnumerable<TService> GetAllInstances<TService>()
{
return _serviceProvider.GetServices<TService>();
var allServices = new List<TService>();
var services = _serviceProvider.GetServices<TService>();
if (services != null)
{
allServices.AddRange(services);
}
var keyedServices = _serviceProvider.GetKeyedServices<TService>(KeyedService.AnyKey);
if (keyedServices != null)
{
allServices.AddRange(keyedServices);
}
return allServices;
}

public object GetInstance(Type serviceType)
Expand All @@ -33,7 +55,7 @@ public object GetInstance(Type serviceType, string key)
{
// Microsoft.Extensions.DependencyInjection does not support keyed services out of the box.
// You might need to implement a custom logic or use a third-party library for this.
throw new NotSupportedException("Keyed services are not supported.");
return _serviceProvider.GetRequiredKeyedService(serviceType, key);
}

public TService GetInstance<TService>()
Expand All @@ -43,9 +65,7 @@ public TService GetInstance<TService>()

public TService GetInstance<TService>(string key)
{
// Microsoft.Extensions.DependencyInjection does not support keyed services out of the box.
// You might need to implement a custom logic or use a third-party library for this.
throw new NotSupportedException("Keyed services are not supported.");
return _serviceProvider.GetKeyedService<TService>(key);
}

public T GetService<T>()
Expand Down
Loading