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()方法解析可選的依賴項。
我該如何解決這個問題?