Github user NightOwl888 commented on the issue:

    https://github.com/apache/lucenenet/pull/209
  
    > Another thing is that we don't really hide much complexity for the 
developer but instead take away his freedom to decide when and where indexes 
etc. should be initialized or at least provide some pre-stage knowledge of it 
as each index would have to have a replicator configured, these should then be 
accessible from where he writes to the index has they have to be notified of 
changes...
    
    I disagree. We are not taking anything away from the user by doing this - 
they are always free to drop to the lower-level Lucene APIs to do any low-level 
configuration such features.
    
    But the grand plan is (hopefully...someday...with enough contributions) to 
have integration packages with all of the .NET UI frameworks so 
application-level configuration can be done at application startup using DI and 
so all of the boilerplate code that everyone writes to add search to the 
application can be reduced to a fluent API configuration (the same way that 
most .NET libraries do it). We know nearly every web app will need an 
IndexWriter per index registered as a singleton. Why not do that with one (or 
two) `.AddSearch()` method where the configuration operations are specified as 
simple variables in one place (the place where every other global feature of 
the app is configured)? We could easily provide a way to do most of the common 
options that apply to 80-90% of users (and would save 80-90% of users from 
having to deal with a complex API to get the simple features they want).
    
    I don't see any reason at all to expose the HttpRequest/HttpResponse in 
this API - there are only a few ways this can go that are sensible. Sure, this 
might make sense at a low level (particularly if this is the piece that we plug 
into every HTTP listener-capable framework), but these details are not 
necessary for it to be useful for the end user (after all, they are interacting 
with it through a URL).
    
    And sure, there are other features of Lucene that need to interact with the 
UI directly and so forth that need other integration APIs to interoperate. But 
certainly there is no question that an HTTP listener is a one-time per 
application thing, not something that would ever be registered in a controller. 
The client on the other hand may be a different story.
    
    Also, we should make the .NET version of replicator support interop with 
the Java Lucene replicator. For that to work, the URL scheme should be the same 
as Lucene by default. The [replication service 
documentation](https://lucene.apache.org/core/4_8_0/replicator/org/apache/lucene/replicator/http/ReplicationService.html)
 clearly specifies this as:
    
    ```
    /<context>/<shard>/<action>
    ```
    
    Of course, we should probably provide a way to override this - routing 
conflicts happen. But this is the logical default setting. I haven't looked 
into whether this is even configurable in Java or would require a custom 
compile in order to get it to interoperate.
    
    Most likely the common use case for the server will be a standalone 
application that serves as a server only. So, I would expect routing conflicts 
in this situation to be rare.
    
    Even if you go the path of using a controller for this (which is an 
option), we should stay away from attribute routing for the simple reason that 
it is impossible to change after it is compiled into the library. A better 
argument for never using it is the fact that routing is *order sensitive* and 
.NET Reflection (which is how Attributes are read) by definition has *undefined 
order*. I have answered who knows how many questions on StackOverflow for 
people who have hit that landmine. The solution is to add an Order parameter to 
the attributes, but once again if the attribute is compiled into the DLL there 
is no way to fix this problem.
    
    On the other hand, using convention-based routing allows you do define the 
AddLuceneReplication() method where the route will be added in relation to the 
other routes, based on the order the methods are called at application startup 
(which is unclear to me if that is possible with middleware - it should be...).
    
    I made a similar implementation in MvcSiteMapProvider for the 
[`XmlSiteMapController`](https://github.com/maartenba/MvcSiteMapProvider/blob/master/src/MvcSiteMapProvider/MvcSiteMapProvider/Web/Mvc/XmlSiteMapController.cs).
  It registers its own routes using convention-based routing. It used 
WebActivator to load the routing for the controller. Although, this was before 
Microsoft made the nice `Startup.cs` class where everything could be configured 
using extension methods so this is not exactly how I would do it now. Instead, 
I would give the user the ability to configure it in `Startup.cs`, where other 
3rd parties do it. And that is where I would provide extension method overloads 
to configure alternate route URLs and any other advanced options that may be 
needed.
    
    The user of course always has the option to *not* call the method at 
application startup, build their own controller, and dig into any of the more 
advanced options (assuming there are any left that are not in the extension 
method overloads). But why should everyone have to do this?
    
    >  it's apparently not that simple, and currently I don't fully get the 
idea behind the design from the java implementation... The things I do get 
though is that it is a master/slave implementation and a polling implementation.
    
    There is [some 
documentation](https://github.com/apache/lucene-solr/blob/releases/lucene-solr/4.8.0/lucene/replicator/src/java/org/apache/lucene/replicator/package.html)
 in the repo about how replicator is configured in Java, but it seems to be 
missing from the [4.8.0 API 
docs](https://lucene.apache.org/core/4_8_0/replicator/index.html). 
    
    A quick search also reveals [this mailing list 
thread](https://lists.gt.net/lucene/java-user/225677) which links to [a blog 
post](http://shaierera.blogspot.com/2013/05/the-replicator.html) that seems to 
describe it in more detail.
    
    Does this help? If not, I suggest contacting the Lucene team (and link to 
the above) via the Lucene user list to see if they can provide better answers 
on the intended workflow. I skimmed it, but it is still not very clear to me 
where the client (who calls the server every 30 seconds) would need to be. 
Maybe a Quartz.net task? Or a Windows service/other type of persistent app that 
runs when the computer is started? Certainly, that is the part that has the 
most complexity - it needs to keep track of the URLs to call to replicate 
everything and provide the commands to the replication servers.
    
    > Move EnumrableExtensions to Lucene.Support? or Lucene.Util?
    
    Lucene.Support is the only place where we are putting code that is not a 
port of something from Java, so that would be the place to put it. 


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to