Tôi đang tìm cách dọn dẹp một câu lệnh chuyển đổi lớn trả về một lớp C# để thực hiện một số công việc (mã nguồn ở đây).
Tôi không muốn ánh xạ rõ ràng từng giao diện để triển khai thực hiện cụ thể trong mô-đun ninject (về cơ bản là mô phỏng trường hợp chuyển đổi dài, nhưng trong tệp khác) nên tôi thiết lập mô-đun để tự động ràng buộc tất cả các giao diện:
public class FactoryModule: NinjectModule
{
public override void Load()
{
Kernel.Bind(x => x.FromThisAssembly()
.IncludingNonPublicTypes()
.SelectAllClasses()
.InNamespaceOf<FactoryModule>()
.BindAllInterfaces()
.Configure(b => b.InSingletonScope()));
}
}
Sau đó tạo lớp nhà máy, thực hiện StandardKernal mà sẽ nhận các giao diện cụ thể và triển khai của họ thông qua một ví dụ singleton sử dụng một Ikernal:
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);
}
Sau đó thực hiện StandardKernel bạn có thể nhận được ở một ny giao diện bởi các định danh của bạn lựa chọn trên giao diện trang trí lớp học của bạn.
ví dụ .:
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";
}
}
Cách sử dụng:
[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);
}
Nguồn
2017-11-16 21:16:50
Có thể muốn kiểm tra mã của bạn - dòng đầu tiên không phải là pháp C#. –
Xin lỗi. Cảm ơn lời nhắc. Nghĩ rằng tôi đã sửa nó trước khi đăng. Sửa ngay bây giờ. – BuddyJoe