我对如何在服务中实现构造函数感兴趣。我对.NET有点新意,所以如果问题太微不足道,请不要误会我的意思。
这是我目前的构造函数,但我想完全理解(因为它看起来像它的工作,我从某处获取代码)
// initialize UnitOfWork
private IUnitOfWork _unitOfWork;
public TownService()
: this(new UnitOfWork())
{
}
public TownService(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
: this
的含义是什么,首先调用哪一个?另外我看到有: base
的构造函数,但我认为那是首先调用superclass
的那个。
我是否需要致电新UnitOfWork()
? UnitOfWork
不应该是factory
(共享)实例吗?或者它是factory
而新的UnitOfWork
并没有创建新的,而是从内存中获取初始值?
感谢。
答案 0 :(得分:2)
C#中的构造函数
鉴于你的代码
public TownService()
: this(new UnitOfWork())
{
//1
}
public TownService(IUnitOfWork unitOfWork)
{
//2
_unitOfWork = unitOfWork;
}
调用new TownService()
将
UnitOfWork
并调用重载TownService(IUnitOfWork unitOfWork)
,因此执行// 2。这是因为this(...)
电话。你需要从某处获取IUnitOfWork的实例,但调用无参数构造函数然后实例化一个新的UnitOfWork
可能不是你想要的 - 它不是真的给你带来很大的灵活性
使用工厂
如果你想使用工厂,你可以选择
ITownService s = new TownService(myFactory.Get<IUnitOfWork>());
因此避免了无参数构造函数。
使用IoC
如果您想使用IoC容器,您可能会使用这样的容器来配置容器
myContainer.Register<IUnitOfWork, UnitOfWork>(); //May need to provide database transaction or whatever
myContainer.Register<ITownService, TownService>();
在创建控制器时,您还需要告诉ASP.NET MVC使用容器。您可以通过创建一个知道您的IoC容器的ControllerFactory
来完成此操作。大多数IoC容器都带有这样的工厂以及如何使用它的说明。
完成后,您就可以将控制器声明为
public class MyController
{
public MyController(ITownService townService)
{
/*...*/
}
}
并让ASP.NET MVC和你的IoC容器完成剩下的工作。