У меня есть ServiceStack AppHostHttpListenerBase сконфигурирован в моих тестах с целью выполнения тестов, как так:ServiceStack AppHostHttpListenerBase не в состоянии разрешить службу зависимостям
public class UserProfileBehaviours : BaseTest<UserProfileService>
{
[Test]
public void Can_access_secure_service()
{
var client = GetClientWithUserPassword();
var result = ((IRestClient)client).Get(new Dto.View.Requests.UserProfileRequest
{
Slug = "user"
});
result.Result.UserAccount.Username.Should().Be("user");
}
}
Моего BaseTest выглядит:
[TestFixture]
public class BaseTest<T>
{
protected TestAppHostHttpListenerBase<T> AppHost;
private const string ListeningOn = "http://localhost:82/";
private const string UserName = "user";
private const string Password = "[email protected]";
protected readonly Container Container;
public BaseTest()
{
Container = new Funq.Container
{
Adapter = new WindsorContainerAdapter()
};
}
[TestFixtureSetUp]
public void OnTestFixtureSetUp()
{
AppHost = new TestAppHostHttpListenerBase<T>();
AppHost.Init();
AppHost.Start(ListeningOn);
}
[TestFixtureTearDown]
public void OnTestFixtureTearDown()
{
AppHost.Dispose();
}
protected IServiceClient GetClient()
{
return new JsonServiceClient(ListeningOn);
}
protected IServiceClient GetClientWithUserPassword()
{
return new JsonServiceClient(ListeningOn)
{
UserName = UserName,
Password = Password
};
}
}
И тогда мои WindsorContainerAdapter:
И, наконец, мой TestAppHostH ttpListener
public class TestAppHostHttpListenerBase<T> : AppHostHttpListenerBase
{
public const string WebHostUrl = "http://localhost:82/";
private InMemoryAuthRepository _userRep;
private const string UserName = "user";
private const string Password = "[email protected]";
public const string LoginUrl = "specialLoginPage.html";
public TestAppHostHttpListenerBase()
: base("Validation Tests", typeof(T).Assembly)
{
}
public override void Configure(Container container)
{
var appSettings = new AppSettings();
SetConfig(new EndpointHostConfig { WebHostUrl = WebHostUrl });
Plugins.Add(new AuthFeature(
() =>
new AuthUserSession(),
new IAuthProvider[]
{
new BasicAuthProvider(),
new CredentialsAuthProvider(),
new TwitterAuthProvider(appSettings),
new FacebookAuthProvider(appSettings)
}, "~/" + LoginUrl));
container.Register<ICacheClient>(new MemoryCacheClient());
_userRep = new InMemoryAuthRepository();
container.Register<IUserAuthRepository>(_userRep);
CreateUser(1, UserName, null, Password, new List<string> { "TheRole" }, new List<string> { "ThePermission" });
}
private void CreateUser(int id, string username, string email, string password, List<string> roles = null, List<string> permissions = null)
{
string hash;
string salt;
new SaltedHash().GetHashAndSaltString(password, out hash, out salt);
if (_userRep.GetUserAuthByUserName(username) == null)
{
_userRep.CreateUserAuth(new UserAuth
{
Id = id,
DisplayName = "DisplayName",
Email = email ?? "[email protected]{0}.com".Fmt(id),
UserName = username,
FirstName = "FirstName",
LastName = "LastName",
PasswordHash = hash,
Salt = salt,
Roles = roles,
Permissions = permissions
}, password);
}
}
}
Когда контейнер выполнен я могу видеть, что есть компонент для UserAccountRepository
однако - если этот компонент является зависимостях для UserProfileService
клиент получает исключение, говоря, что autowired зависимостях не может быть решена. Что я не понимаю, где AppHostHttpListenerBase
получить контейнер?
Мой адаптер Windsor никогда не запрашивается Resolve
компонентом для репозитория.
Как я могу предоставить контейнер AppHostHttpListenerBase
, чтобы он мог разрешить эти зависимости? Или мне нужно настроить его другим способом?
BOOM !! Спасибо приятель – iwayneo