Using Ninject, can I create an instance from an interface without exposing my concrete class?
When you bind an interface to a concrete type, you can ask for an instance of that interface and obtain the concrete type. In your example, you could do this:
var sword = kernel.Get<ISword>();
And this would give you a concrete Sword
object. You can do a lot more with the binding system, too. You could even Bind<ISword>().ToMethod(MySwordFactory);
and write a method to get Swords based on the requesting context.
Another thing you can do is to change how binding works based on the type it's being injected into. For example, you could expose a property on a custom class like so:
public class MyClass {
[Inject]
public ISword Sword { get; set; }
}
And then you could bind to a specific ISword implementation based on the MyClass:
Bind<ISword>().To<Sword>().WhenInjectedInto<MyClass>();
There are a lot more options, but this should give you a rough overview.