网上找了一天,终于简单的配置完了Spring.Net的AOP+IOC配置,记录一下
导入DLL
先来一张WEB.Config的完整配置
<?xml version="1.0"?>
<!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=301880
-->
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<!--LOG4-->
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!--Spring.NET配置节信息-->
<sectionGroup name="spring">
<!--Spring.Net配置-->
<section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/>
</sectionGroup>
<!--Spring.NET配置节信息END-->
</configSections>
<!--Spring配置信息-->
<spring>
<!--Spring.Net配置-->
<context>
<resource uri="file://~/Config/controllers.xml"/>
<resource uri="file://~/Config/services.xml"/>
<resource uri="file://~/Config/aopdal.xml"/>
</context>
</spring>
<!--Spring配置信息End-->
<log4net>
<root>
<level value="WARN" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
<logger name="testApp.Logging">
<level value="DEBUG"/>
</logger>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value="log-file.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header] "/>
<param name="Footer" value="[Footer] "/>
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
</log4net>
<appSettings>
<add key="webpages:Version" value="3.0.0.0"/>
<add key="webpages:Enabled" value="false"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5"/>
<httpRuntime/>
<pages controlRenderingCompatibilityVersion="4.0"/>
</system.web>
</configuration>
1.IOC
配置文件
WEB.CONFIG
<configuration>
<--configSections需要紧跟configuration-->
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!--Spring.NET配置节信息-->
<sectionGroup name="spring">
<!--Spring.Net配置-->
<section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/>
</sectionGroup>
<!--Spring.NET配置节信息END-->
</configSections>
<!--Spring配置信息-->
<spring>
<!--Spring.Net配置-->
<context>
<resource uri="file://~/Config/controllers.xml"/>
<resource uri="file://~/Config/services.xml"/>
<resource uri="file://~/Config/aopdal.xml"/>
</context>
</spring>
<!--Spring配置信息End-->
<--以下无关配置-->
<appSettings>
<add key="webpages:Version" value="3.0.0.0"/>
<add key="webpages:Enabled" value="false"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
<add key="ModelMappingAssembly" value="Project.Model"/>
<add key="OracleClient" value="Project.Model"/>
<add key="SqlConnection" value=""/>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5"/>
<httpRuntime/>
<pages controlRenderingCompatibilityVersion="4.0"/>
</system.web>
</configuration>
另外独立出去的配置文档(services.xml,其他xml同样方式配置在外面)
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
<object name="DAL_User" type="FirstWebDemo.DAL.DAL_User,FirstWebDemo" singleton="false">
<!--<property name="modelName" value="User"> </property>-->
<!--//属性注入-->
<constructor-arg index="0" value="User"/>
</object>
</objects>
代码段 bll 手动注入,后面再研究自动注入
public class BLL_User : IBLL_User
{
private DAL.IDAL_User IDAL_User; //=new DAL.DAL_User("User");
public BLL_User(DAL_User user)
{
this.IDAL_User = user;
}
public User GetUser(User user)
{
IApplicationContext ctx = ContextRegistry.GetContext();
IDAL_User = (IDAL_User)ctx.GetObject("DAL_User");
return IDAL_User.GetUser().FirstOrDefault();
}
DAI
public class DAL_User:BaseProject.DataProvide.DataAccess<User>,IDAL_User
{
//public DAL_User()
//{
//}
public DAL_User(string modelName):base (modelName)
{
}
internal Project.Models.Models.User GetUser(Project.Models.Models.User user)
{
List<User> listUser = base.GetList();
return (User)listUser.Where(x => x.UserID == user.UserID).FirstOrDefault();
}
public List<User> GetUser()
{
log4net.ILog log = log4net.LogManager.GetLogger("testApp.Logging");
log.Info(string.Format("GetUser。。。。"));
return base.GetList();
}
}
controller:新建的Factory构造Controller,controller一直实例化不了,好像是只支持0参数的构造器,需要在研究?
public class LoginController : Controller
{
//
// GET: /Home/
private IBLL_User bll_User;
public LoginController()
{
}
public LoginController(BLL_User bll_User)
{
this.bll_User = bll_User;
}
public class MyControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
IApplicationContext context = ContextRegistry.GetContext();
IDictionary<string, object> k = context.GetObjectsOfType(controllerType);
return (IController)context.GetObjectsOfType(controllerType).First().Value;
//return base.GetControllerInstance(requestContext, controllerType);
}
}
}
2.log4简单配置
<log4net>
<root>
<level value="WARN" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
<logger name="testApp.Logging">
<level value="DEBUG"/>
</logger>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value="log-file.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header] "/>
<param name="Footer" value="[Footer] "/>
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
</log4net>
使用:默认生成为项目路径下log-file.txt文件
log4net.ILog log = log4net.LogManager.GetLogger("testApp.Logging");
log.Info(string.Format("启动了前置AOP。。。。。方法{0}....target:target..." + DateTime.Now.ToString(), method.Name));
3.aop:WEBCONFIG 配置信息和IOC一样,新增一个XML配置
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net" xmlns:aop="http://www.springframework.net/aop">
<description>配置实现AOP</description>
<!--不用修改,必须要写的,不让不能拦截,对象名切入点:ObjectNameAutoProoxyCreateor-->
<object name="ProxyCreator" type="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator, Spring.Aop">
<property name="ObjectNames">
<list>
<value>DAL*</value>
<!--注意在这里通配的是你CS文件的名字,而不是你的方法名。要修改-->
</list>
</property>
<property name="InterceptorNames">
<list>
<value>AroundAdvisor</value>
<!--修改为你在XML定义的PointcutAdvisor-->
</list>
</property>
</object>
<object name="AroundAdvice" type="FirstWebDemo.AOP.AOP_DAL_User, FirstWebDemo"/>
<!--修改为要切入类-->
<!--不修改-->
<object name="AroundAdvisor" type="Spring.Aop.Support.NameMatchMethodPointcutAdvisor, Spring.Aop">
<property name="Advice" ref="AroundAdvice"/><!--刚刚定义的要切入的类-->
<property name="MappedNames"><!--要拦截的方法-->
<list>
<value>Get*</value>
<value>Del*</value>
</list>
</property>
</object>
</objects>
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Spring.Aop;
namespace FirstWebDemo.AOP
{
public class AOP_DAL_User : IMethodBeforeAdvice
{
public void Before(System.Reflection.MethodInfo method, object[] args, object target)
{
log4net.ILog log = log4net.LogManager.GetLogger("testApp.Logging");
log.Info(string.Format("启动了前置AOP。。。。。方法{0}....target:target..." + DateTime.Now.ToString(), method.Name));
Console.WriteLine("结束: " + method.Name + "." + method.Name);
}
}
}
成功,今天就这样,剩下的后面研究