私は抽象として共通ライブラリの依存関係リゾルバインタフェースを使用します。これにより、コンテナの切り替えに柔軟に対応できます。以下のインターフェースと静的IoCクラスを考えると、グローバルなasaxからIKernel
を渡していない工場でIoCを初期化する必要があります。NinjectでIKernelをプロパティとして注入
Ninjectカーネルを作成するには、NinjectHttpApplication
ベースをどのように使用しているのですか。
ここに問題があります。 CtsDependencyFactory
のIKernel
プロパティは常にnull
です。
Ninjectはこのように自分自身を挿入しませんか?別の方法を使用してIKernel
を工場に渡す必要がありますか?私はのような静的なクラスをNinjectのStructureMap
に見つけることができませんでした。
何か助けていただければ幸いです。あなたは正しくNInject(またはそのことについては、DIコンテナ)を使用していない
public interface IResolveDependency
{
T Resolve<T>();
T Resolve<T>(params object[] parameters);
T Resolve<T>(string name);
T Resolve<T>(string name, params object[] parameters);
object Resolve(Type type);
IEnumerable<T> ResolveAll<T>();
void Clear();
}
public interface IResolveDependencyFactory
{
IResolveDependency CreateInstance();
}
public class CtsDependencyResolver : IResolveDependency
{
private readonly IKernel m_kernel;
public CtsDependencyResolver(IKernel kernel)
{
m_kernel = kernel;
}
#region Implementation of IResolveDependency
// removed for brevity
#endregion
}
public class CtsDependencyFactory : IResolveDependencyFactory
{
[Inject]
public IKernel Kernel { get; set; }
#region Implementation of IResolveDependencyFactory
public IResolveDependency CreateInstance()
{
return new CtsDependencyResolver(Kernel);
}
#endregion
}
public static class IoC
{
public static IResolveDependency DependencyResolver { get; private set; }
public static void InitilizeWith(IResolveDependencyFactory factory)
{
DependencyResolver = factory.CreateInstance();
}
public static void Register<T>(T instance)
{
if (DependencyResolver is IRegisterDependency)
((IRegisterDependency)DependencyResolver).Register(instance);
else
throw new InvalidOperationException("cannot register service");
}
public static T Resolve<T>(string name)
{
return DependencyResolver.Resolve<T>(name);
}
public static T Resolve<T>(string name, params object[] parameters)
{
return DependencyResolver.Resolve<T>(name, parameters);
}
public static T Resolve<T>()
{
return DependencyResolver.Resolve<T>();
}
public static T Resolve<T>(params object[] parameters)
{
return DependencyResolver.Resolve<T>(parameters);
}
public static object Resolve(Type type)
{
return DependencyResolver.Resolve(type);
}
public static IEnumerable<T> ResolveAll<T>()
{
return DependencyResolver.ResolveAll<T>();
}
public static void Clear()
{
DependencyResolver.Clear();
}
}
public class MvcApplication : NinjectHttpApplication
{
private IKernel m_kernel;
// removed stuff
protected override void OnApplicationStarted()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
IoC.InitilizeWith(new CtsDependencyFactory());
}
protected override IKernel CreateKernel()
{
var modules = new INinjectModule[]
{
new FormHandlerModule()
};
m_kernel = new StandardKernel(modules);
return m_kernel;
}
}
おかげ
_I共通ライブラリの依存関係リゾルバインタフェースを抽象として使用します。これにより、コンテナの切り替えに柔軟に対応できます._ これは無意味な抽象化のように思えるので、設計、作成、テスト、保守が必要な無意味なコードが残ってしまいます。これには、報酬の高いコードに時間を費やさない機会費用を含む、コストがあります。これはコンテナを実際に変更したことがない限り私が書いたコードではないので、何度か変更する可能性が高いと思いました。しかし、私はあなたがコンテナをそんなに変えている理由について質問します。 – jason
これらの2つのインタフェースとIoCは共通ライブラリにあり、さまざまなモジュールで使用されています。モジュールは、この場合構造マップ、自動ファクシミリまたはネインジェクションなどの異なるコンテナを使用するさまざまなアプリケーションで使用されます。実際には非常に便利です。私はこれが理にかなってほしい。 –