WPF MVVM架構 EF、WCF、IOC 設計示例經典


概要

該演示項目利用WPF應用程序構建的MVVM架構示例, 運用了Unity容器接口注入, MVVM的經典設計, 后台利用的EF+WCF。

 

后台實現:

從數據庫生成的emdx 結合上下文進行數據交互, 服務以WCF發布:

public class FactoryManager
    {
        private IDataManager dataManager;

        public FactoryManager()
        { 
            //can easily switch to other providers in the future without changing client code
            dataManager = new EntityFrameworkManager();
        }

        public ICustomerManager GetCustomerManager()
        {
            return dataManager.GetCustomerManager();
        }

        public IOrderManager GetOrderManager()
        {
            return dataManager.GetOrderManager();
        }
    }
 class EntityFrameworkManager : IDataManager
    {
        ICustomerManager IDataManager.GetCustomerManager()
        {
            return new CustomerManager();
        }

        IOrderManager IDataManager.GetOrderManager()
        {
            return new OrderManager();
        }

        class CustomerManager : ICustomerManager
        {     
            int ICustomerManager.Add(string firstName, string lastName)
            {
                using (var context = new MasterDetailEntities())
                {
                    Customer c = new Customer { FirstName = firstName, LastName = lastName };
                    context.Customers.AddObject(c);
                    context.SaveChanges();
                    return c.CustomerId;
                }
            }

            void ICustomerManager.Delete(int customerId)
            {
                using (var context = new MasterDetailEntities())
                {
                    Customer c = context.Customers.Where(i => i.CustomerId == customerId).First();
                    context.DeleteObject(c);
                    context.SaveChanges();
                }
            }

            void ICustomerManager.Update(int customerId, string firstName, string lastName)
            {
                using (var context = new MasterDetailEntities())
                {
                    Customer c = context.Customers.Where(i => i.CustomerId == customerId).First();
                    c.FirstName = firstName;
                    c.LastName = lastName;
                    context.SaveChanges();
                }
            }

            List<Customer> ICustomerManager.FindAll()
            {
                using (var context = new MasterDetailEntities())
                {
                    return context.Customers.ToList();
                }
            }

            Customer ICustomerManager.FindByOrder(int orderId)
            {
                using (var context = new MasterDetailEntities())
                {
                    return context.Orders.Where(i => i.OrderId == orderId).First().Customer;
                }
            }
        }

        class OrderManager : IOrderManager
        {
            int IOrderManager.Add(string description, int quantity, int customerId)
            {
                using (var context = new MasterDetailEntities())
                {
                    Order order = new Order { Description = description, Quantity = quantity };
                    context.Customers.First(i => i.CustomerId == customerId).Orders.Add(order);
                    context.SaveChanges();
                    return order.OrderId;
                }
            }

            void IOrderManager.Delete(int orderId)
            {
                using (var context = new MasterDetailEntities())
                {
                    Order a = context.Orders.Where(i => i.OrderId == orderId).First();
                    context.DeleteObject(a);
                    context.SaveChanges();
                }
            }

            void IOrderManager.Update(int orderId, string description, int quantity)
            {
                using (var context = new MasterDetailEntities())
                {
                    Order a = context.Orders.Where(i => i.OrderId == orderId).First();
                    a.Description = description;
                    a.Quantity = quantity;
                    context.SaveChanges();
                }
            }

            List<Order> IOrderManager.FindByCustomer(int customerId)
            {
                using (var context = new MasterDetailEntities())
                {
                    return context.Customers.First(i => i.CustomerId == customerId).Orders.ToList();
                }
            }

            Order IOrderManager.Find(int orderId)
            {
                using (var context = new MasterDetailEntities())
                {
                    return context.Orders.First(i => i.OrderId == orderId);
                }
            }
        }

    }

 

WCF服務:

 

部分wcf接口實現:

[ServiceContract]
    public interface ICustomerService
    {
        [OperationContract]
        List<Customer> GetCustomers();

        [OperationContract]
        int AddCustomer(string FirstName, string LastName);

        [OperationContract]
        void UpdateCustomer(Customer c);

        [OperationContract]
        void DeleteCustomer(int customerId);
    }
 public class CustomerService : ICustomerService
    {

        List<Customer> ICustomerService.GetCustomers()
        {
            List<Customer> result = new List<Customer>();
            foreach (Business.Customer i in Business.CustomerManager.Instance().CustomerList)
                result.Add(new Customer(i));
            return result;
        }

        int ICustomerService.AddCustomer(string firstName, string lastName)
        {
            return Business.CustomerManager.Instance().AddCustomer(firstName, lastName);
        }

        void ICustomerService.UpdateCustomer(Customer c)
        {
            Business.CustomerManager.Instance().UpdateCustomer(new Business.Customer(c.CustomerId, c.FirstName, c.LastName));
        }

        void ICustomerService.DeleteCustomer(int customerId)
        {
            Business.CustomerManager.Instance().DeleteCustomer(customerId);
        }


    }

 

Unity實現:

接口及實現:

public interface IServiceLocator
    {
        void Register<TInterface, TImplementation>() where TImplementation : TInterface;

        TInterface Get<TInterface>();
    }
class UnityServiceLocator : IServiceLocator
    {
        private UnityContainer container;

        public UnityServiceLocator()
        {
            container = new UnityContainer();
        }
    
        void IServiceLocator.Register<TInterface, TImplementation>()
        {
            container.RegisterType<TInterface, TImplementation>();
        }

        TInterface IServiceLocator.Get<TInterface>()
        {
            return container.Resolve<TInterface>();
        }
    }

全局靜態類

class ServiceProvider
    {
        public static IServiceLocator Instance { get; private set; }

        public static void RegisterServiceLocator(IServiceLocator s)
        {
            Instance = s;
        }
    }

進行Unitity容器接口注入:

            //initialize all the services needed for dependency injection
            //we use the unity framework for dependency injection, but you can choose others
            ServiceProvider.RegisterServiceLocator(new UnityServiceLocator());  

            //register the IModalDialog using an instance of the CustomerViewDialog
            //this sets up the view
            ServiceProvider.Instance.Register<IModalDialog, CustomerViewDialog>(); 

 

ViewModel 模塊操作進行Unitity容器獲取接口實例(紅色實現部分)

        private void ShowAddDialog()
        {
            CustomerViewModel customer = new CustomerViewModel();
            customer.Mode = Mode.Add;

           IModalDialog dialog = ServiceProvider.Instance.Get<IModalDialog>();
            dialog.BindViewModel(customer);
            dialog.ShowDialog();
        } 

 

MVVM DataContext關聯ViewModel:

通過DataContext關聯模塊的ViewModel層實現所有的操作。

this.DataContext=  xxViewModel;

view頁面:

ViewModel部分綁定實現:

所有的ViewModel統一實現ViewModelBase 接口, 進行屬性通知。

 public ICommand UpdateCommand
        {
            get
            {
                if (updateCommand == null)
                {
                    updateCommand = new CommandBase(i => this.Update(), null);
                }
                return updateCommand;
            }
        }

        public ICommand DeleteCommand
        {
            get
            {
                if (deleteCommand == null)
                {
                    deleteCommand = new CommandBase(i => this.Delete(), null);
                }
                return deleteCommand;
            }
        }

 

源代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM