我的解決方案中有兩個項目:BusinessLibrary和Web(asp.net MVC 4)。我正在使用autofac進行DI,看起來在一些不活動之後,控制器中的注入對象變爲空。我做錯了autofac中的生命週期配置嗎?Autofac:閒置後我得到「對象引用未設置爲對象的實例」
Web項目
的AccountController從BusinessLibrary這樣引用服務類:
public class AccountController : Controller
{
private readonly IAccountService accountService;
public AccountController(){}
public AccountController(IAccountService accountService)
{
this.accountService = accountService;
}
[HttpPost]
public ActionResult Logon(User model)
{
if (accountService.AuthenticateUser(model.Username, model.Password))
{
//... some logic here
}
}
}
這是Global.asax.cs中:在IoCConfig
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
//some other logic here
IoCConfig.RegisterDependencies();
}
}
最後,autofac配置:
public static void RegisterDependencies()
{
var builder = new ContainerBuilder();
// register services
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerHttpRequest();
// register controllers
builder.RegisterControllers(typeof(MvcApplication).Assembly).InstancePerHttpRequest();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
BusinessLibrary項目
帳戶服務等級:
public interface IAccountService
{
bool AuthenticateUser(string username, string password);
}
public class AccountService : IAccountService
{
private readonly IAuthenticationService authenticationService;
public AccountService(IAuthenticationService authenticationService)
{
this.authenticationService = authenticationService;
}
public bool AuthenticateUser(string username, string password)
{
//some logic that uses authenticationService
}
}
的AccountService接受IAuthenticationService的實例,這是我從一個被引用的DLL,它做了一些AD認證邏輯得到。
問題
當我在VS2012重建後,我的本地機器(IIS 7.5)上運行它,我可以登錄,一切工作正常。 現在,如果我將該選項卡打開並執行其他操作,則在我進入頁面並嘗試執行任何操作後,出現異常:對象引用未設置爲對象實例。這裏的帳戶服務是空的在這裏:
public class AccountController : Controller
{
// constructors...
[HttpPost]
public ActionResult Logon(User model)
{
if (accountService.AuthenticateUser(model.Username, model.Password)) // accountService is null
任何幫助將不勝感激。
PS。我在SO上檢查了類似的問題,但是這些都是在私有構造函數或web.config文件中的雙重autofac配置。
請問,如果你刪除'builder.RegisterAssemblyTypes它的工作...'和手動註冊這樣'builder.RegisterType <帳戶服務>()。作爲()。InstancePerHttpRequest();' –
Win
@Win,我可以在BusinessLibrary中註冊'AccountService as IAccountService',但我無法註冊'AuthenticationService as IAuthenticationService',它在BusinessLibrary中引用。但是你的回答實際上讓我想到Asp.web不應該負責註冊BL使用的類。我會嘗試重新設計這種關係,因爲這裏有一些根本性的錯誤。 – mai