これら ( +、+、+、+ ) のページを読みましたが、どうすればよいかわかりません。
私はこの単純なインターフェースと具象型を持っています:
public interface IIdentifierGenerator {
long Generate(Type type);
long Generate<TType>(TType type);
}
public HiloIdentifierGenerator : IIdentifierGenerator { /* implementation... */ }
私はこれを作成しますDependencyResolver
:
public class SelfHostedSimpleInjectorWebApiDependencyResolver : IDependencyResolver {
private readonly Container _container;
private readonly LifetimeScope _lifetimeScope;
public SelfHostedSimpleInjectorWebApiDependencyResolver(
Container container)
: this(container, false) {
}
private SelfHostedSimpleInjectorWebApiDependencyResolver(
Container container, bool createScope) {
_container = container;
if (createScope)
_lifetimeScope = container.BeginLifetimeScope();
}
public IDependencyScope BeginScope() {
return new SelfHostedSimpleInjectorWebApiDependencyResolver(
_container, true);
}
public object GetService(Type serviceType) {
return ((IServiceProvider)_container).GetService(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType) {
return _container.GetAllInstances(serviceType);
}
public void Dispose() {
if (_lifetimeScope != null)
_lifetimeScope.Dispose();
}
}
サーバーを次のように構成しました。
_config = new HttpSelfHostConfiguration("http://192.168.1.100:20000");
_config.Routes.MapHttpRoute(
"API Default", "api/{controller}/{id}",
new { id = RouteParameter.Optional });
_config.DependencyResolver =
new SelfHostedSimpleInjectorWebApiDependencyResolver(
IoC.Wrapper.GetService<Container>());
_server = new HttpSelfHostServer(_config);
/* etc. */
そして、これは私のコントローラーです:
public class IdentifierController : ApiController {
private readonly IIdentifierGenerator _identifierGenerator;
public IdentifierController(IIdentifierGenerator identifierGenerator) {
_identifierGenerator = identifierGenerator;
}
public long Get(string id) {
var type = Type.GetType(id, false, true);
return type == null ? -1 : _identifierGenerator.GetIdentifier(type);
}
}
ここで、アクション メソッドを呼び出すと、次のエラーが発生します。
スレッド間で LifetimeScope インスタンスを使用するのは安全ではありません。ライフタイム スコープが囲む完全な操作が同じスレッド内で実行されることを確認し、LifetimeScope インスタンスが作成されたときに同じスレッドで破棄されることを確認します。Dispose は ManagedThreadId 28 のスレッドで呼び出されましたが、ID 29 のスレッドで作成されました。
私はどこで間違っていますか?助けていただけますか?