最近,我使用过asp.net mvc,在示例项目中看到的是使用Database Factory类。您如何为我解释为什么使用它?
IDatabaseFactory类
public interface IDatabaseFactory : IDisposable
{
EFMVCDataContex Get();
}
DatabaseFactory类
public class DatabaseFactory : Disposable, IDatabaseFactory
{
private EFMVCDataContex dataContext;
public EFMVCDataContex Get()
{
return dataContext ?? (dataContext = new EFMVCDataContex());
}
protected override void DisposeCore()
{
if (dataContext != null)
dataContext.Dispose();
}
}
这是一个抽象工厂设计模式的示例。想法是创建一个接缝,以在类之间提供松散的耦合,以便可以出于测试目的或扩展应用程序而交换另一种类型的上下文。
一般而言,工厂是一种管理短期依赖项(例如数据库连接)的方法。通常,框架公开一种注入工厂实例的方法,然后该框架可以基于接口(在本例中为IDatabaseFactory)作为框架与框架用户之间的契约来使用它。该框架将具有类似于以下内容的代码:
public interface ISomeService
{
void DoSomething();
}
public class SomeService()
{
private readonly IDatabaseFactory factory;
// The factory is injected through the constructor
public SomeService(IDatabaseFactory factory)
{
this.factory = factory;
}
public void DoSomething()
{
using (EFMVCDataContex context = this.factory.Get())
{
// Run a LINQ query here using the context
} // This bracket disposes the context
}
}
与工厂创建的上下文相比,服务实例化的寿命更长。更重要的是,在这种情况下,上下文始终可以正确处理。
现在,这样做的主要好处是您可以将DatabaseFactory与替代实现(通常称为Liskov替代原理)交换:
public class MyDatabaseFactory : Disposable, IDatabaseFactory
{
private EFMVCDataContex dataContext;
public EFMVCDataContex Get()
{
return dataContext ?? (dataContext = new AlternateDataContext());
}
protected override void DisposeCore()
{
if (dataContext != null)
dataContext.Dispose();
}
}
假设AlternateDataContext继承(或实现)EFFMCDataContex,则可以将MyDatabaseFactory与DatabaseFactory进行苹果换苹果,而无需对SomeService进行任何更改。
可以在构造函数中使用连接字符串对MyDatabaseFactory进行编码,例如,为您提供了一种连接备用数据库的方法。
当然,这样做的另一个很大好处是创建了IDatabaseFactory的模拟实现,该实现可用于测试DoSomething方法。在单元测试中,SomeService(被测类)应该是唯一使用的真实类,IDatabaseFactory应该是模拟类(可以通过手动编码类或使用模拟框架来完成)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句