新建项目如下:
一个模型类,一个接口,一个实现方法。我的目的很明确就是在UI层通过Castle 调用数据访问层的方法。
添加项目引用
CastleDemo.DataAccess 引用 CastleDemo.Domain
CastleDemo.WebUI 引用 CastleDemo.Domain(不需要引用CastleDemo.DataAccess)
安装组件
CastleDemo.DataAccess和 CastleDemo.Domain 都需安装 Castle.Core , Castle.Windsor
CastleDemo.DataAccess 安装 EntityFramework
CastleDemo.Domain
IRepository:
public interface IRepository where T : class
{
///
/// 查询
///
/// 查询条件
/// 排序条件
///
IEnumerable Find(Expression> condition, Expression> order = null);
}
Product:
public class Product
{
public string productId { get; set; }
public string productName { get; set; }
}
IoCContainer:
internal class IoCContainer
{
private static readonly object syncRoot = new object();
private IoCContainer() { }
private static IWindsorContainer _Instance;
public static IWindsorContainer Instance
{
get
{
lock (syncRoot)
{
if (_Instance == null)
{
_Instance = new WindsorContainer().Install(Configuration.FromAppConfig());
}
return _Instance;
}
}
}
}
Factories:
public class Factories
{
public static T Repository() where T : class
{
return IoCContainer.Instance.Resolve();
}
}
CastleDemo.DataAccess
BaseRepository:
public class BaseRepository : IRepository where T : class
{
private castledemoContext context = Factories.Repository();
public IEnumerable Find(Expression> condition, Expression> order = null)
{
if (order == null)
{
return context.Set().Where(condition);
}
return context.Set().Where(condition).OrderByDescending(order);
}
}
IocInstaller:
public class IoCInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For().LifeStyle.PerWebRequest);
container.Register(Classes.FromThisAssembly()
.InNamespace("CastleDemo.DataAccess.RepositoryImpl", true)
.LifestylePerWebRequest()
.WithService.AllInterfaces());
}
}
CastleDemo.WebUI
HomeController >> Index:
public ActionResult Index()
{
Expression> condition = m => m.productName.Contains("产品");
Expression> order = m => m.productId;
var products = Factories.Repository>().Find( order: order,condition: condition);
return View(products);
}
Web.config里还需在相应的地方添加一些配置:
--分割--
--分割--
在运行代码前,我们还差最后一步,在前面的添加引用的时候WebUI层没有添加对CastleDemo.DataAccess层的引用,那么这个时 候我们需要把CastleDemo.DataAccess层的EntityFramework.dll 和 CastleDemo.DataAccess.dll拷贝到WebUI的BIN里面,但又有个问题来了,那我们每次对 CastleDemo.DataAccess层代码的改动都要重新拷贝,多麻烦啊,解决方法请参考我的另一篇文章VS XCOPY
最后运行看下效果:
参考Windsor Tutorial: