2017-06-27 11 views
0

NancyFxを使用するasp.netアプリケーションがあります。私は自分のデータベースのライセンスに基づいて特定のモジュールだけを登録したい。これは、モジュールが異なる構成に基づいて同じルートを持つためです。NancyFxは、特定のコードのみを登録します。

INancyModuleCatalogを実装するカスタムクラスを作成する必要があると思いました。

パブリッククラスCustomModuleCatalog:INancyModuleCatalog { private IDictionary _modules;

public CustomModuleCatalog() 
{ 
    // The license type is read from db in Global.ascx. 
    // So I want to register a module based on a namespace. 
    // The namespace is the same like the license name. 
    if(WebApiApplication.LicenseType == LicenseType.RouteOne) 
    { 
     var assemblyTypes = Assembly.GetExecutingAssembly().GetTypes(); 
     var modules = assemblyTypes.Where(t => t.Namespace != null && t.Namespace.EndsWith(WebApiApplication.SystemType.ToString())); 
     var nancy = modules.Where(t => t.IsAssignableFrom(typeof(INancyModule))); 
     foreach (var type in nancy) 
     { 
      var nancyType = (INancyModule)type; 
      _modules.Add(type, (INancyModule)Activator.CreateInstance(type)); 
     } 
    } 
} 

public IEnumerable<INancyModule> GetAllModules(NancyContext context) 
{ 
    return _modules?.Values; 
} 

public INancyModule GetModule(Type moduleType, NancyContext context) 
{ 
    if (_modules != null && _modules.ContainsKey(moduleType)) 
    { 
     return _modules[moduleType]; 
    } 
    return null; 
} 

}

どのように私のブートストラップでこのカタログを登録するには?

答えて

1

boostrapperもINancyModuleCatalogの実装です(あなたがDefaultNancyBootstrapperを使用していると仮定した場合)ここでライン97を参照してください。https://github.com/NancyFx/Nancy/blob/master/src/Nancy/DefaultNancyBootstrapper.cs#L97

を私はあなたがあなた自身のカタログを登録するだけでなく、独自のブートストラップを作成する必要があると考えています。

しかし、あなた自身のカタログを提供する必要がありますか?ライセンスタイプに基づいて切り替えられるモジュールのコンストラクタでライセンスタイプのチェックを行い、該当する場合にのみルートを登録できますか?

;

public class RouteOne : NancyModule 
{ 
    public RouteOne() 
    { 
     if (xxx.License != LicenseType.RouteOne) return; 

     Get["/"] = _ => Response.AsJson(new {Message = "This is route one"}); 
    } 
} 

public class RouteTwo : NancyModule 
{ 
    public RouteTwo() 
    { 
     if (xxx.License != LicenseType.RouteTwo) return; 

     Get["/"] = _ => Response.AsJson(new { Message = "This is route two" }); 
    } 
} 
+0

私はコンストラクタをどちらも呼びたくありませんでしたが、正直言って私はこの単純な解決方法を思いついたわけではありません:-) – Franki1986

関連する問題