Tôi có danh sách các Trình tạo Dữ liệu (đang phát triển). Máy phát điện mà tôi cần được tạo bởi một lớp nhà máy. Tất cả các máy tạo đều thực hiện một Giao diện chung, bao gồm một số thứ khác là một chuỗi tĩnh name
.Mẫu Nhà máy, chọn theo Thuộc tính
Điều tôi muốn làm: Gọi phương thức factory.reate với thông số chuỗi cho tên được đề cập ở trên. Phương thức create tìm máy phát với tên này và trả về một cá thể mới của trình tạo đã nói.
Tiền thưởng theo ý kiến của tôi về cách này để làm điều đó: Tôi chỉ phải thêm các lớp máy phát điện mới mà không phải chỉnh sửa nhà máy.
Câu hỏi:
- Đây có phải là một cách tốt để xử lý vấn đề này?
- Tôi làm cách nào để tìm tất cả máy phát? Phản ánh trên mọi thực hiện của giao diện/mọi thành viên của không gian tên (duy nhất cho các máy phát + giao diện của họ)?
- Có đúng không khi gọi cách này để làm việc một nhà máy, hoặc đây có phải là một mô hình khác không?
Cuối cùng tôi sẽ gọi cho nhà máy như thế này (giản thể):
//Caller
public DataModel GetData2()
{
var generator = new DataFactory().Create("Gen.2");
return generator.GetData();
}
//Factory
public class DataFactory
{
public AbstractDataGenerator Create(string type)
{
//Here the magic happens to find all implementations of IDataGenerator
var allGenerators = GetImplementations();
var generator = allGenerators.FirstOrDefault(f => f.name == type);
if (generator != null)
return (AbstractDataGenerator)Activator.CreateInstance(generator);
else
return null;
}
}
//Interface
public abstract class AbstractDataGenerator
{
public static string name;
public abstract DataModel GetData();
}
//Data-Generators
public class DataGen1 : AbstractDataGenerator
{
public static string name = "Gen.1";
public DataModel GetData()
{
return new DataModel("1");
}
}
public class DataGen2 : AbstractDataGenerator
{
public static string name = "Gen.2";
public DataModel GetData()
{
return new DataModel("2");
}
}
nên sự kỳ diệu GetImplementations()
trong nhà máy được thực hiện thông qua Reflection hoặc bằng cách nào đó khác nhau? Tôi có nên sử dụng một cách tiếp cận hoàn toàn khác không?
Vì câu trả lời tham chiếu đến IoC và DI: Dự án này sử dụng NInject, vì vậy nó sẽ có sẵn. Chuyển từ giao diện sang lớp trừu tượng.
Một vấn đề tôi đã tìm thấy với phương pháp này là để có được sự "Tên" tài sản của các máy phát điện bạn _need một thể hiện của các object_. – stuartd
Đó là lý do tại sao tôi đã tạo thuộc tính tĩnh. Điều này sẽ loại bỏ sự cần thiết cho một trường hợp, nếu tôi không nhầm. – MilConDoin
Giao diện không thể có thành viên tĩnh .. – stuartd