【发布时间】:2017-02-09 02:34:58
【问题描述】:
问题是我有 3 层项目:DataAccess dll 和 Presentation dll 依赖于 Logic dll。在逻辑上,我定义了接口 od IRepository, IMyIdentityUser 等。在 DataAccess 中,我使用 Microsoft Identity 框架向继承 IdentityUser<Guid> 和 IMyIdentityUser 接口的 MyIdentityUser 注册新用户。我也在使用 IoC 容器。
假设我有一个名为“Register”的 Presentation (MVC) 层方法,其参数为“RegisterViewModel viewModel”,它将注册逻辑委托给Logic dll 中的某个类。
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = MyCore.Resolve<IMyIdentityUser>(); //this is service locator
// antipattern and I want to get
// rid of this
user.UserName = model.Email;
user.Email = model.Email;
var userManager = _userManager;
var result = await userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
var signInManager = _signInManager;
await signInManager.SignInAsync(user, false, false);
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
return View(model);
}
如您所见,我正在使用服务定位器来获取 MyIdentityUser 的新实例。我不想将其创建为“new MyIdentityUser()”,因为这迫使我与定义了 MyIdentityUser 的 DataAccess dll 使用紧密耦合。
另外,我不想在构造函数参数IMyIdentityUser 中包含并在每次创建 MVC 控制器时强制 IoC 容器创建新的用户实例。
我想我可以使用某种抽象工厂,比如
interface IMyIdentityUserFactory
{
IMyIdentityUser CreateNewUser(string name, string email); //any other better arguments?
// not like registerViewModel because
// this view model should be defined in presentation logic
}
并将其作为参数传递给控制器构造函数(可能在外观参数中带有另一个逻辑连接的参数),但我不确定这一点,因为它通常与传递孤独的IMyIdentityUser 相同。
有更好的方法吗?
【问题讨论】:
标签: c# asp.net-mvc dependency-injection service-locator