2013-07-02 65 views
0

我有一個類Autofac依賴性解析錯誤

public interface IDbContext : IDisposable 
{ 
    IDbConnection Connection { get; } 

    IDbTransaction CreateOpenedTransaction(); 

    IEnumerable<T> ExecuteProcedure<T>(string procedure, dynamic param = null, IDbTransaction transaction = null); 

    int ExecuteProcedure(string procedure, dynamic param = null, IDbTransaction transaction = null); 
} 

這是實現:

public sealed class DbContext : IDbContext 
{ 
    private bool disposed; 
    private SqlConnection connection; 

    public DbContext(string connectionString) 
    { 
     connection = new SqlConnection(connectionString); 
    } 

    public IDbConnection Connection 
    { 
     get 
     { 
      if (disposed) throw new ObjectDisposedException(GetType().Name); 

      return connection; 
     } 
    } 

    public IDbTransaction CreateOpenedTransaction() 
    { 
     if (connection.State != ConnectionState.Open) 
      Connection.Open(); 
     return Connection.BeginTransaction(); 
    } 

我嘗試這樣autofac解決的Dependance:

公共類RepositoryBaseTest { 私人靜態IContainer _container;

[TestInitialize] 
    public virtual void TestInitialize() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterAssemblyTypes(typeof(ICommandHandler<object>).Assembly) 
       .AsImplementedInterfaces() 
       .SingleInstance(); 

     builder.RegisterAssemblyTypes(typeof(IQuery<object>).Assembly) 
       .AsImplementedInterfaces() 
       .SingleInstance(); 

     builder.RegisterAssemblyTypes(typeof(IQueryMultiple<object>).Assembly) 
       .AsImplementedInterfaces() 
       .SingleInstance(); 

     builder.Register<IMemberRepository>(c => 
     new MemberRepository(
      c.Resolve<IDbContext>())) 
     .SingleInstance(); 

     builder.Register<IDbContext>(c => 
      new DbContext(ConfigurationManager.ConnectionStrings["Speed"].ConnectionString)) 
      .Named<IDbContext>("Speed") 
      .InstancePerDependency(); 

     _container = builder.Build(); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(_container)); 
    } 

    #region Resolve 

    protected void ExecuteCommand<T>(T command) 
    { 
     _container.Resolve<ICommandHandler<T>>().Execute(command); 
    } 

    protected IEnumerable<T> Query<T>(Func<T, bool> condition) 
    { 
     return _container.Resolve<IQueryMultiple<T>>().Where(condition); 
    } 

    protected T Select<T>(Func<T, bool> condition) 
    { 
     return _container.Resolve<IQuery<T>>().Select(condition); 
    } 

    protected T Resolve<T>() 
    { 
     return _container.Resolve<T>(); 
    } 

    #endregion 
} 

和在類測試,我嘗試測試:

public class MemberRepositoryTest : RepositoryBaseTest 
{ 
    private IMemberRepository _memberRepository; 

    [TestInitialize] 
    public override void TestInitialize() 
    { 
     base.TestInitialize(); 
     _memberRepository = new MemberRepository(Resolve<IDbContext>()); 
    } 

但我捕獲錯誤在此指令:_memberRepository =新MemberRepository(解析());

請求的服務'IDbContext'尚未註冊。爲避免此異常,請註冊組件以提供服務,使用IsRegistered()檢查服務註冊,或使用ResolveOptional()方法解析可選的依賴項。

我該如何解決這個問題?

回答

0

解決方案1. 您註冊了一個IDbContext作爲命名服務。

.Named<IDbContext>("Speed") 

因此,您必須使用ResolveNamed方法。

_container.ResolveNamed<IDbContext>("Speed"); 

解決方案2. 您只需註冊一個IDbContext作爲一種類型。在這種情況下,Resolve()方法應該可以正常工作。

builder.Register<IDbContext>(c => 
      new DbContext(ConfigurationManager.ConnectionStrings["Speed"].ConnectionString)) 
      .InstancePerDependency();