Possiedo un servizio Web che eseguirà operazioni con alcuni dati passati (in particolare, InfoPath xml da una raccolta documenti di SharePoint). Attualmente sto usando Ninject per gestire i dati del modulo "strategia" da caricare. Ecco po 'di codice (domanda segue):Associazione di rilegatura basata sulla stringa
Web Service (punto di ingresso)
namespace Web.Services
{
public bool AddForm(XmlDocument form, string formName)
{
IKernel kernel = new StandardKernel(new FormsModule());
var ctx = kernel.Get<IPFormDataContext>(formName);
return ctx.DoWork(form);
}
}
Ninject cose relative
namespace Core.Modules
{
public class FormsModule : NinjectModule
{
public override void Load()
{
Bind<IPFormDataContext>().ToSelf().Named("FormA");
Bind<IPFormDataContext>().ToSelf().Named("FormB");
// Snip
Bind<IPFormDataStrategy>().To<FormAStratgey>()
.WhenParentNamed("FormA");
Bind<IPFormDataStrategy>().To<FormBStrategy>()
.WhenParentNamed("FormB");
// Snip
}
}
}
modello correlati Cose
namespace Core.Forms
{
public class IPFormDataContext
{
private IPFormDataStrategy _ipFormDataStrategy;
public IPFormDataContext(IPFormDataStrategy strategy)
{
_ipFormDataStrategy = strategy;
}
public bool DoWork(XmlDocument form)
{
return _ipFormDataStrategy.DoWork(form);
}
}
public abstract class IPFormDataStrategy
{
public abstract bool DoWork(XmlDocument form);
}
}
namespace Core.Forms.FormStrategies
{
class FormAStrategy : IPFormDataStrategy
{
public override bool DoWork(XmlDocument form)
{
// Deserialize form using (xsd.exe generated) FormAData
// and perform some operation on the resulting data.
return resultOfWork;
}
}
}
FormBStrategy è più o meno lo stesso , così come le altre 7 strategie che non ho elencato. Sto cercando di trovare un modo per passare un modulo xml al servizio web e chiamare la deserializzazione del modulo corretta in base al tipo di modulo che sta arrivando.
Il codice sopra "funziona"; ma sembra che sto facendo una sorta di posizione di servizio in Ninject, che da quello che sto leggendo è una cosa negativa . Ma non riesco a pensare a un modo corretto per farlo. Non sono morto impostato sull'utilizzo di Ninject, o qualsiasi framework IOC/DI per quella materia.
È quello che sto facendo ... sbagliato? Potrei essere indicato nella giusta direzione?
Questo sembra un buon posto per un generico: potresti fare qualcosa come 'IPFormDataContext dove T: IPFormDataStrategy' per ripulirlo? Non sono così familiare con il ninject. –
lukegravitt