Question

I have an api which will be publicly exposed and have a sandbox. I've written some code in my ResourceFactory so api.sandbox.whatever/whatever will work and also sandbox=true in the arguments will work but this feels like a giant hack. Any better ways to do it?

Here is my code:

public class NinjectResourceFactory : IResourceFactory
{
    private readonly IKernel _productionKernel;
    private readonly IKernel _sandboxKernel;

    public NinjectResourceFactory()
    {
        _productionKernel = new StandardKernel(new QueryMasterModule());
        _sandboxKernel = new StandardKernel(new QueryMasterModule(true));
    }

    public object GetInstance(Type serviceType, InstanceContext instanceContext, HttpRequestMessage request)
    {                        
        string uri = request.RequestUri.ToString();
        if (uri.Contains(".sandbox."))
        {
            return _sandboxKernel.Get(serviceType);
        }
        else if (uri.Contains("sandbox=true"))
        {
            request.RequestUri = new Uri(uri.Replace("sandbox=true", ""));
            return _sandboxKernel.Get(serviceType);
        }
        else
        {
            return _productionKernel.Get(serviceType);    
        }            
    }

    public void ReleaseInstance(InstanceContext instanceContext, object service)
    {
        // todo do I need to implement this?
    }
}
Was it helpful?

Solution

If it's supposed to be a true sandbox then you don't want the two sites to run in the same process. I would deploy two web sites and let IIS decide which one based on host name. That way the sandbox will be isolated from production, which is the purpose of a sandbox.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top