Hi,
The GeometryService is actually a task which, like any other task in the API requires a URL to work. the LocalGeometryService is actually a class for administering a local instance of a geometry service. The slight difference in naming convention arises from trying to maintain consistency with the web APIs (JavaScript, Flex, SilverLight) and the mobile APIs (Windows Phone, etc). So all you need to do is start a LocalGeometryService then pass it's Url property to the GeometryService task. Fortunately, we've added a convenient local extension to the GeometryService class to help you do this - so the simplest code to achieve this becomes a two liner:
GeometryService geometryTask = new GeometryService();
geometryTask.InitializeWithLocalService();
//... use the GeometryService to perform an operation e.g. Project();
... Or if you want to do this asynchronously:
GeometryService geometryTask = new GeometryService();
geometryTask.InitializeWithLocalServiceAsync(localGeometryService =>
{
//... use the GeometryService to perform an operation e.g. Project();
});
The functionality is the same whether you are using an online GeometryService instance or a local/offline instance. This will help with most of your requirements. The polygon class of geometry supports multiple rings which will cater for exterior rings and interior rings. The geometry must have been created clockwise to be valid in this respect. If the geometry was created counter clockwise you can use the Simplify method on the GeometryService task class to generate topologically valid geometry.
Cheers
Mike