第二講:Asp.Net+Autofac+EF/ADO.NET Winform OA(2)-Autofac注入


作者:地溝油

進入首頁

 

1.在ivw.Unity新增AutofacContainer類。

  AutofacContainer代碼:

 1 using Autofac;
 2 using Autofac.Builder;
 3 using System;
 4 using System.Threading;
 5 
 6 namespace ivw.Unity
 7 {
 8     public class AutofacContainer
 9     {
10         private Autofac.IContainer container;
11         #region 使用單例模式對對象實例化
12         private static AutofacContainer aufacContainer = null;
13 
14         /// <summary>
15         /// 
16         /// </summary>
17         /// <returns></returns>
18         public static AutofacContainer GetInstance()
19         {
20             if (aufacContainer == null)
21             {
22                 //使用原子操作方式實現單例模式,解決了多線程問題與雙重判斷加鎖的代碼多問題
23                 Interlocked.CompareExchange<AutofacContainer>(ref aufacContainer, new AutofacContainer(), null);
24             }
25             return aufacContainer;
26         }
27 
28         /// <summary>
29         /// 
30         /// </summary>
31         private AutofacContainer() => container = BuildAutofacContainer();
32         #endregion
33 
34         private Autofac.IContainer BuildAutofacContainer()
35         {
36             try
37             {
38                 var builder = new ContainerBuilder();
39                 RegisterTypes(builder);
40                 var container = builder.Build(ContainerBuildOptions.None);
41                 return container;
42             }
43             catch (Exception ex)
44             {
45                 throw ex;
46             }
47         }
48 
49         private static void RegisterTypes(ContainerBuilder builder)
50         {
51             #region 注冊User
52 
53             #endregion
54         }
55         
56         #region 兼容EF和ADO.NET
57         public T GetObject<T>() => container.Resolve<T>();
58 
59         public T GetObject<T>(string name) => container.ResolveNamed<T>(name);
60         #endregion
61     }
62 }
AutofacContainer

  ServiceHelper代碼:

 1 using ivw.Services;
 2 using ivw.IDao;
 3 namespace ivw.Unity
 4 {
 5     public static class ServiceHelper
 6     {
 7         #region 公共屬性
 8 
 9         #endregion
10 
11         #region 設置Service值
12         public static void SetService()
13         {
14 
15         }
16         #endregion
17     }
18 }
ServiceHelper

2.這樣,框架算是完成了。接下來,我們試試怎么用。

3.在ivw.Models新增一個空的實體數據模型。

4.在數據庫新建表Users。

 1 USE [IVW]
 2 GO
 3 
 4 /****** Object:  Table [dbo].[Users]    Script Date: 2017/11/24 9:20:20 ******/
 5 SET ANSI_NULLS ON
 6 GO
 7 
 8 SET QUOTED_IDENTIFIER ON
 9 GO
10 
11 CREATE TABLE [dbo].[Users](
12     [Id] [int] IDENTITY(1,1) NOT NULL,
13     [UserCode] [nvarchar](10) NOT NULL,
14     [UserName] [nvarchar](20) NOT NULL,
15     [Byname] [nvarchar](20) NULL,
16     [Password] [nvarchar](128) NULL,
17     [PasswordSalt] [nvarchar](128) NULL,
18     [PasswordFormat] [int] NULL,
19     [State] [int] NOT NULL,
20     [Email] [nvarchar](50) NULL,
21  CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
22 (
23     [Id] ASC
24 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
25 ) ON [PRIMARY]
26 GO
27 
28 ALTER TABLE [dbo].[Users] ADD  CONSTRAINT [DF_Users_State]  DEFAULT ((0)) FOR [State]
29 GO
30 
31 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'Id'
32 GO
33 
34 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用戶代碼' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'UserCode'
35 GO
36 
37 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用戶姓名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'UserName'
38 GO
39 
40 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用戶別名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'Byname'
41 GO
42 
43 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'加密的密碼' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'Password'
44 GO
45 
46 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'密碼散列' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'PasswordSalt'
47 GO
48 
49 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'密碼格式' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'PasswordFormat'
50 GO
51 
52 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用戶狀態' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'State'
53 GO
54 
55 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Email' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'Email'
56 GO
57 
58 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用戶信息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users'
59 GO
Users表結構

5.Users插入一條數據。

1 INSERT [dbo].[Users] ([Id], [UserCode], [UserName], [Byname], [Password], [PasswordSalt], [PasswordFormat], [State], [Email]) VALUES (1, N'Admin', N'管理員', NULL, N'000', NULL, NULL, 1, NULL)
Users插入數據

6.從數據庫更新模型,把剛剛新建的Users表更新上去。

7.在ivw.Dao中新建一個文件夾SqlServer,文件夾內新增UsersDao類,繼承接口IUsersDao。

   在ivw.IDao中新增一個IUsersDao接口。

   在ivw.Services新增一個UserServices類。

  UsersDao代碼:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 using ivw.IDao;
 8 using ivw.Models;
 9 
10 namespace ivw.Dao.SqlServer
11 {
12     public class UserDao : IUserDao
13     {
14         /// <summary>
15         /// 登陸
16         /// </summary>
17         /// <param name="UserCode">用戶代碼</param>
18         /// <param name="Password">用戶密碼</param>
19         /// <returns></returns>
20         public List<Users> Login(String UserCode, String Password)
21         {
22             using (DBContainer db = new DBContainer())
23             {
24                 var cc = db.Users.Where(a => a.UserCode.ToLower() == UserCode.ToLower() && a.Password == Password);
25                 return cc.ToList();
26             }
27         }
28     }
29 }
30     
UserDao

  IUserDao代碼:

 1 using ivw.Models;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 
 8 namespace ivw.IDao
 9 {
10     public interface IUserDao
11     {
12         /// <summary>
13         /// 登陸
14         /// </summary>
15         /// <param name="UserCode">用戶代碼</param>
16         /// <param name="Password">用戶密碼</param>
17         /// <returns></returns>
18         List<Users> Login(String UserCode, String Password);
19     }
20 }
IUsersDao

  UserServices代碼:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 using ivw.IDao;
 8 using ivw.Models;
 9 
10 namespace ivw.Services
11 {
12     public class UserServices
13     {
14         private readonly IUserDao userDao;
15         public UserServices(IUserDao userDao)
16         {
17             this.userDao = userDao;
18         }
19         public Users Login(String UserCode, String Password)
20         {
21             var cc = from a in userDao.Login(UserCode, Password)
22                      where a.State==1
23                      select a;
24             return cc.FirstOrDefault();
25         }
26     }
27 }
View Code

8.Autofac注入。

  (1)在AutofacContainer.RegisterTypes中寫入。

1 private static void RegisterTypes(ContainerBuilder builder)
2         {
3             #region 注冊User
4             builder.RegisterType<Dao.SqlServer.UserDao>().As<IDao.IUserDao>();
5             #endregion
6         }
View Code

  (2)在ServiceHelper中寫入。

 1 using ivw.Services;
 2 using ivw.IDao;
 3 namespace ivw.Unity
 4 {
 5     public static class ServiceHelper
 6     {
 7         #region 公共屬性
 8         public static UserServices UserServices { get; set; }
 9         #endregion
10 
11         static ServiceHelper() => SetService();
12 
13         #region 設置Service值
14         public static void SetService()
15         {
16             UserServices = new UserServices(AutofacContainer.GetInstance().GetObject<IUserDao>());
17         }
18         #endregion
19     }
20 }
21     
View Code

8.在frmLogin中新增兩個TextEdit、LabelControl,兩個按鈕,分別是登錄、取消,一個PanelControl.

9.frmLogin后台代碼。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Text;
 7 using System.Linq;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10 using DevExpress.XtraEditors;
11 using ivw.Unity;
12 using ivw.Models;
13 
14 namespace ivw.Windows
15 {
16     public partial class frmLogin : DevExpress.XtraEditors.XtraForm
17     {
18         public frmLogin()
19         {
20             InitializeComponent();
21             this.KeyPreview = true;
22             this.sbtnLogin.Click += SbtnLogin_Click;
23             this.sbtnCancel.Click += SbtnCancel_Click;
24             this.KeyDown += FrmLogin_KeyDown;
25         }
26 
27         private void SbtnLogin_Click(object sender, EventArgs e)
28         {
29             try
30             {
31                 Users sRet = ServiceHelper.UserServices.Login(txteUserCode.Text, txtePassword.Text);
32                 if (sRet != null)
33                 {
34                     this.DialogResult = DialogResult.OK;
35                 }
36 
37             }
38             catch (Exception ex)
39             {
40 
41             }
42         }
43         private void SbtnCancel_Click(object sender, EventArgs e) => System.Diagnostics.Process.GetCurrentProcess().Kill();
44 
45         #region 快捷鍵
46         private void FrmLogin_KeyDown(object sender, KeyEventArgs e)
47         {
48             if (e.KeyCode == Keys.Enter)
49             {
50                 if (txteUserCode.ContainsFocus)
51                 {
52                     txtePassword.Focus();
53                 }
54                 else if (txtePassword.ContainsFocus)
55                 {
56                     SbtnLogin_Click(null, null);
57                 }
58             }
59         }
60         #endregion
61 
62     }
63 }
View Code

10.新增一個frmMain窗體,在Program寫入以下代碼。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Threading.Tasks;
 5 using System.Windows.Forms;
 6 
 7 namespace ivw.Windows
 8 {
 9     static class Program
10     {
11         /// <summary>
12         /// 應用程序的主入口點。
13         /// </summary>
14         [STAThread]
15         static void Main()
16         {
17             //啟用皮膚
18             DevExpress.Skins.SkinManager.EnableFormSkins();
19             DevExpress.LookAndFeel.LookAndFeelHelper.ForceDefaultLookAndFeelChanged();
20             DevExpress.Skins.SkinManager.EnableMdiFormSkins();
21 
22             Application.EnableVisualStyles();
23             Application.SetCompatibleTextRenderingDefault(false);
24             frmLogin frmLogin = new frmLogin();
25             frmLogin.Activate();
26             frmLogin.ShowDialog();          
27             if (frmLogin.DialogResult == DialogResult.OK)
28             {
29                 Application.Run(new frmMain());
30             }
31         }
32     }
33 }
Program

11.調試。輸入帳號密碼登錄。

12.成功登錄,進入frmMain界面。


免責聲明!

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



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