【发布时间】:2017-11-23 01:17:08
【问题描述】:
所以现在我正在尝试设计一个新的招聘计划,该计划授予对活动目录组的访问权限,生成包含他们的信息和位置的文档。
现在我正在使用枚举执行此操作,使用 switch 语句设置 ViewModel 上的详细信息,如下所示:
case CaneRidgeSettings.Departments.SCSC:
Model.ScannerFolder = @"scan1\Supply Chain Service Center\" + Model.UserId;
Model.ExtensionRanges = "list station 8000 to-ext 8349";
Model.AdministrativeAssistant = Loader.SCSCAdminAssistant;
Model.DuoCode = "Franklin TN - 8175";
Model.PrinterSelectedIndex = (int)CaneRidgeSettings.PrinterGroups.Cane_Ridge_5th_Floor_West;
return await find.FindNextComputer("800SCSC");
我对这个设计的问题是,如果我向这座大楼添加更多部门,我必须手动更新这个开关。所以我尝试了一些关于这个的东西,比如字典,但它似乎并没有很好地绑定到组合框(即使在实现我自己的 INotifyCollectionChanged 时)。
所以我创建了一个包含这些信息的界面,为了简单起见,我们只说界面是这样做的:
public interface IDepartmentInfo
{
string DepartmentName { get; }
List<string> ActiveDirectoryGroups { get; }
string AdministrativeAssistant { get; }
string Floor { get; }
}
然后我创建了一个实现这个接口的新类
public class SCSC : IDepartmentInfo
{
public string DepartmentName { get; } = "Shared Services";
public List<string> ActiveDirectoryGroups { get; } = new List<string>() {"Example_AD_GRP","Domain_Users"};
public string AdministrativeAssistant { get; } = "Lisa_Smith@outlook.com";
public string Floor { get; } = "5th Floor East";
public override string ToString() => DepartmentName;
}
然后,在我的主要建筑类中,我有一个可观察的集合,它需要一个 IDepartmentInfo 并初始化这些部门
public class CaneRidgeBuilding : IBuilding
{
public ObservableCollection<IDepartmentInfo> Departments { get; set; } = new ObservableCollection<IDepartmentInfo>() {new SCSC(), new ARS()};
public override string ToString()
{
return "CaneRidge";
}
}
在我的视图模型上,我实现了一些属性,主要是 BuildingSelectedIndex 和 DepartmentSelectedIndex。
我还有一个 IDepartmentInfo 属性,它会在更改时通知它,因为它是数据绑定到我 UI 上的多个标签的。
public class MainWindowViewModel : BindableBase
{
public ObservableCollection<IBuilding> Buildings { get; set; } = new ObservableCollection<IBuilding>() { new CaneRidgeBuilding() };
private ObservableCollection<IDepartmentInfo> _departmentInfos = new ObservableCollection<IDepartmentInfo>();
public ObservableCollection<IDepartmentInfo> DepartmentInfos
{
get { return _departmentInfos; }
set { SetProperty(ref _departmentInfos, value); }
}
private int _buildingIndex = -1;
public int BuildingIndex
{
get { return _buildingIndex; }
set
{
SetProperty(ref _buildingIndex, value);
SetDepartments();
}
}
private void SetDepartments()
{
if (BuildingIndex != -1)
DepartmentInfos = Buildings[BuildingIndex].Departments;
}
private int _departmentIndex = -1;
public int DepartmentIndex
{
get { return _departmentIndex; }
set
{
SetProperty(ref _departmentIndex, value);
LoadDepartmentSettings();
}
}
private IDepartmentInfo _departmentInformation;
public IDepartmentInfo DepartmentInformation
{
get { return _departmentInformation; }
set { SetProperty(ref _departmentInformation, value); }
}
private void LoadDepartmentSettings()
{
if (DepartmentIndex != -1)
DepartmentInformation = DepartmentInfos[DepartmentIndex];
}
private string _title = "Prism Application";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
public MainWindowViewModel()
{
}
}
它完全按照我想要的方式工作,但是我现在遇到的问题是我将如何处理依赖注入?如果我有 10 个部门实施 IDepartmentInfo,我究竟如何将它传递给可观察的集合?
因为在我引入新建筑的那一刻,如果我告诉 Unity 解析所有 IDepartmentInfos,我会得到每个部门,即使它不属于 CaneRidge。
如果我将部门拆分到每个建筑物,那么我会遇到无法轻松将部门加载到 ViewModel 的问题,因为它需要一个 IDepartmentInfo 集合。如果我将它限制为仅一种类型的集合,那么它就行不通了。
我是不是把事情复杂化了?
【问题讨论】:
-
我不熟悉如何将 unity 连接到 WPF,但您可以在服务注册时使用反射在所有引用的程序集中查找
IDepartmentInfo的所有后代,并注册它们。跨度>