/// <summary>
/// Interface for components that wish to be started by the container
/// </summary>
public interface IStartable
{
void Start();
void Stop();
}
<facility id="startable.facility"
type="Castle.Facilities.Startable.StartableFacility, Castle.MicroKernel" />
public class Base4Host : IStartable
private const string _machineName = "localhost";
private const string _provider = "SQL2005";
private string _appName;
private int _port;
private string _root;
private ServerConfiguration _configuration;
private IServerProxy _proxy;
public ServerConfiguration Configuration
get { return _configuration; }
public IServerProxy ServerProxy
get { return _proxy; }
public Base4Host(string appName, int port)
if (string.IsNullOrEmpty(appName)) throw new ArgumentNullException("appName");
if (port <= 1024) throw new ArgumentOutOfRangeException("port", "port should be greater then 1024");
_appName = appName;
_port = port;
public Base4Host(string appName, int port, string root)
: this(appName, port)
if (string.IsNullOrEmpty(root)) throw new ArgumentNullException("root");
_root = root;
#region IStartable Members
public void Start()
_configuration = CreateConfiguration();
_proxy = ServerFactory.StartServer(_configuration, false);
string base4Context = string.Format("tcp://Server:@localhost:{0}/{1}", _port, _appName);
StorageContext.SetDefault(base4Context);
public void Stop()
_proxy.Stop();
_proxy = null;
_configuration = null;
#endregion
#region Support methods
private ServerConfiguration CreateConfiguration()
ServerConfiguration configuration = new ServerConfiguration();
DiscoverApplicationName();
InsertApplicationRoot(configuration);
InsertConnectionStrings(configuration);
InsertConnectivityInformation(configuration);
if (!Directory.Exists(configuration.Store.Root))
Directory.CreateDirectory(configuration.Store.Root);
return configuration;
private void InsertConnectivityInformation(ServerConfiguration configuration)
configuration.Store.Name = _appName;
configuration.Store.Provider = _provider;
configuration.Store.Port = _port;
configuration.Store.MachineName = _machineName;
private void DiscoverApplicationName()
if (string.IsNullOrEmpty(_appName))
if (HttpContext.Current.Application["AppName"] == null)
Assembly assembly = Assembly.GetCallingAssembly();
HttpContext.Current.Application["AppName"] = (AssemblyTitleAttribute.GetCustomAttribute(assembly, typeof(AssemblyTitleAttribute)) as AssemblyTitleAttribute).Title;
_appName = HttpContext.Current.Application["AppName"].ToString();
private void InsertApplicationRoot(ServerConfiguration configuration)
string root = string.IsNullOrEmpty(_root) ? HttpContext.Current.Server.MapPath("~/") : _root;
configuration.Store.Root = root.EndsWith("\\") ? root + "App_Data\\Base4" : root + "\\App_Data\\Base4";
private void InsertConnectionStrings(ServerConfiguration configuration)
string connectionStringName = ConfigurationManager.AppSettings["DefaultConnection"];
if (string.IsNullOrEmpty(connectionStringName) && ConfigurationManager.ConnectionStrings != null
&& ConfigurationManager.ConnectionStrings.Count > 0)
connectionStringName = ConfigurationManager.ConnectionStrings[0].Name;
configuration.Store.ConnectionString = string.IsNullOrEmpty(connectionStringName) ? ConfigurationManager.AppSettings["Store.ConnectionString"] :
ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
SqlConnectionStringBuilder connStrBuilder = new SqlConnectionStringBuilder(configuration.Store.ConnectionString);
connStrBuilder.InitialCatalog = "master";
configuration.MasterConnectionString = connStrBuilder.ToString();
<component
id="base4host.default"
type="MyProject.Base4Host, MyProject">
<parameters>
<appName>GoatsAndBoats</appName>
<port>11888</port>
</parameters>
</component>
For the optional parameters, I'm thinking of doing something like this:
<facility id="base4.storageFacility"
type="SomeProject.Core.Base4StorageFacility, SomeProject.Core"
host="true"
appName="GoatsAndBoats"
port="11888"
connectionString="local"
/>