저는 C# 클래스를 반환하여 코드 작업을 수행하는 막대한 switch 문을 정리할 방법을 찾고있었습니다 (여기에서 코드 냄새가납니다).
각 인터페이스를 ninject 모듈의 구체적인 구현 (사실상 긴 스위치 케이스를 모방하지만 diff 파일)에 명시 적으로 매핑하고 싶지 않았기 때문에 모든 인터페이스를 자동으로 바인딩하도록 모듈을 설정했습니다.
public class CarFactoryKernel : StandardKernel, ICarFactoryKernel{
public static readonly ICarFactoryKernel _instance = new CarFactoryKernel();
public static ICarFactoryKernel Instance { get => _instance; }
private CarFactoryKernel()
{
var carFactoryModeule = new List<INinjectModule> { new FactoryModule() };
Load(carFactoryModeule);
}
public ICar GetCarFromFactory(string name)
{
var cars = this.GetAll<ICar>();
foreach (var car in cars)
{
if (car.CarModel == name)
{
return car;
}
}
return null;
}
}
public interface ICarFactoryKernel : IKernel
{
ICar GetCarFromFactory(string name);
}
이 그런 다음 StandardKernel 구현이 얻을 수 있습니다
public class FactoryModule: NinjectModule
{
public override void Load()
{
Kernel.Bind(x => x.FromThisAssembly()
.IncludingNonPublicTypes()
.SelectAllClasses()
.InNamespaceOf<FactoryModule>()
.BindAllInterfaces()
.Configure(b => b.InSingletonScope()));
}
}
는 그런 다음 IKernal를 사용하여 단독 인스턴스를 통해 지정된 인터페이스와 그 구현을 얻을 것이다되는 StandardKernal을 구현 팩토리 클래스를 생성 여러분의 클래스를 꾸미는 인터페이스에서 여러분이 선택한 식별자로 인터페이스합니다.
예컨대 :
public interface ICar
{
string CarModel { get; }
string Drive { get; }
string Reverse { get; }
}
public class Lamborghini : ICar
{
private string _carmodel;
public string CarModel { get => _carmodel; }
public string Drive => "Drive the Lamborghini forward!";
public string Reverse => "Drive the Lamborghini backward!";
public Lamborghini()
{
_carmodel = "Lamborghini";
}
}
사용법 :
[Test]
public void TestDependencyInjection()
{
var ferrari = CarFactoryKernel.Instance.GetCarFromFactory("Ferrari");
Assert.That(ferrari, Is.Not.Null);
Assert.That(ferrari, Is.Not.Null.And.InstanceOf(typeof(Ferrari)));
Assert.AreEqual("Drive the Ferrari forward!", ferrari.Drive);
Assert.AreEqual("Drive the Ferrari backward!", ferrari.Reverse);
var lambo = CarFactoryKernel.Instance.GetCarFromFactory("Lamborghini");
Assert.That(lambo, Is.Not.Null);
Assert.That(lambo, Is.Not.Null.And.InstanceOf(typeof(Lamborghini)));
Assert.AreEqual("Drive the Lamborghini forward!", lambo.Drive);
Assert.AreEqual("Drive the Lamborghini backward!", lambo.Reverse);
}
당신의 코드를 확인 할 수 있습니다 - 바로 첫 번째 줄은 법적 C#을하지 않습니다. –
죄송합니다. 알림 주셔서 감사. 나는 게시하기 전에 그것을 고쳤다 고 생각했다. 지금 바로 잡아라. – BuddyJoe