پروژه IRIS آقای سعیدیفر مباحث تعریف کاربران و نقشها رو در یک پروژه MVC4 و EF Code first به خوبی پیاده سازی کرده که میتونه مثال آموزشی بسیار عالی باشد.
پاسخ به بازخوردهای پروژهها
public class BackgroundWorkerViewModel : BaseViewModel { private List<string> _myData; public BackgroundWorkerViewModel() { LoadDataCommand = new RelayCommand(OnLoadData); } public RelayCommand LoadDataCommand { get; set; } public List<string> MyData { get { return _myData; } set { _myData = value; RaisePropertyChanged(() => MyData); } } public bool IsBusy { get; set; } private void OnLoadData() { var backgroundWorker = new BackgroundWorker(); backgroundWorker.DoWork += (sender, e) => { MyData = new List<string> {"Test"}; Thread.Sleep(1000); }; backgroundWorker.RunWorkerCompleted += (sender, e) => { IsBusy = false; }; backgroundWorker.RunWorkerAsync(); } }
[TestFixture] public class BackgroundWorkerViewModelTest { #region Setup/Teardown [SetUp] public void SetUp() { _backgroundWorkerViewModel = new BackgroundWorkerViewModel(); } #endregion private BackgroundWorkerViewModel _backgroundWorkerViewModel; [Test] public void TestGetData() { _backgroundWorkerViewModel.LoadDataCommand.Execute(_backgroundWorkerViewModel); Assert.NotNull(_backgroundWorkerViewModel.MyData); Assert.IsNotEmpty(_backgroundWorkerViewModel.MyData); } }
public interface IWorker { void Run(DoWorkEventHandler doWork); void Run(DoWorkEventHandler doWork, RunWorkerCompletedEventHandler onComplete); }
public class AsyncWorker : IWorker { public void Run(DoWorkEventHandler doWork) { Run(doWork, null); } public void Run(DoWorkEventHandler doWork, RunWorkerCompletedEventHandler onComplete) { var backgroundWorker = new BackgroundWorker(); backgroundWorker.DoWork += doWork; if (onComplete != null) backgroundWorker.RunWorkerCompleted += onComplete; backgroundWorker.RunWorkerAsync(); } }
public class SyncWorker : IWorker { #region IWorker Members public void Run(DoWorkEventHandler doWork) { Run(doWork, null); } public void Run(DoWorkEventHandler doWork, RunWorkerCompletedEventHandler onComplete) { Exception error = null; var doWorkEventArgs = new DoWorkEventArgs(null); try { doWork(this, doWorkEventArgs); } catch (Exception ex) { error = ex; throw; } finally { onComplete(this, new RunWorkerCompletedEventArgs(doWorkEventArgs.Result, error, doWorkEventArgs.Cancel)); } } #endregion }
public class BackgroundWorkerViewModel : BaseViewModel { private readonly IWorker _worker; private List<string> _myData; public BackgroundWorkerViewModel(IWorker worker) { _worker = worker; LoadDataCommand = new RelayCommand(OnLoadData); } public RelayCommand LoadDataCommand { get; set; } public List<string> MyData { get { return _myData; } set { _myData = value; RaisePropertyChanged(() => MyData); } } public bool IsBusy { get; set; } private void OnLoadData() { IsBusy = true; // view is bound to IsBusy to show 'loading' message. _worker.Run( (sender, e) => { MyData = new List<string> {"Test"}; Thread.Sleep(1000); }, (sender, e) => { IsBusy = false; }); } }
[TestFixture] public class BackgroundWorkerViewModelTest { #region Setup/Teardown [SetUp] public void SetUp() { _backgroundWorkerViewModel = new BackgroundWorkerViewModel(new SyncWorker()); } #endregion private BackgroundWorkerViewModel _backgroundWorkerViewModel; [Test] public void TestGetData() { _backgroundWorkerViewModel.LoadDataCommand.Execute(_backgroundWorkerViewModel); Assert.NotNull(_backgroundWorkerViewModel.MyData); Assert.IsNotEmpty(_backgroundWorkerViewModel.MyData); } }