[ http://issues.apache.org/jira/browse/IBATISNET-122?page=all ]
     
Gilles Bayon closed IBATISNET-122:
----------------------------------


> Allow Resources.cs to process non-fullly-qualified-types
> --------------------------------------------------------
>
>          Key: IBATISNET-122
>          URL: http://issues.apache.org/jira/browse/IBATISNET-122
>      Project: iBatis for .NET
>         Type: Bug
>     Reporter: Ron Grabowski
>     Assignee: Ron Grabowski
>     Priority: Minor

>
> IBatisNet should be able to handle loading a type if that type's assembly has 
> already been loaded into the current domain. For example in log4net its 
> possible to use this syntax:
>  <appender name="FileAppender" type="log4net.Appender.FileAppender">
>  ...
>  </appender>
> You don't need to specify the log4net assembly becuase the log4net assembly 
> has already been loaded in the current domain. In other words, you can't tell 
> log4net to process the log4net.config file unless the log4net assembly has 
> been successfully loaded:
>  <!-- log4net isn't required becuase the current domain has already loaded 
> the log4net assembly -->
>  <appender name="FileAppender" type="log4net.Appender.FileAppender, log4net">
>  ...
>  </appender>
> The same thing can be applied to IBatisNet's handling of embedded resources.  
> The GetEmbeddedResourceAsXmlDocument method of Resources.cs has the following 
> code:
>  public static XmlDocument GetEmbeddedResourceAsXmlDocument(string resource)
>  {
>   // snip
>   FileAssemblyInfo fileInfo = new FileAssemblyInfo(resource);
>   if (fileInfo.IsAssemblyQualified)
>   {
>    // snip
>   } 
>   else
>   {
>    // bare type name... loop thru all loaded assemblies
>    Assembly [] assemblies = AppDomain.CurrentDomain.GetAssemblies();
>    foreach (Assembly assembly in assemblies)
>    {
>     Stream stream = assembly.GetManifestResourceStream(fileInfo.FileName);
>     // snip
>    }
>   }
>   //snip
>  }
> The important thing to note here is that IsAssemblyQualified will always be 
> true. It can never be false which means the else block is never processed. 
> The FileAssemblyInfo constructor calls through to SplitFileAndAssemblyNames:
>  // WRONG
>  private void SplitFileAndAssemblyNames (string originalFileName) 
>  {
>   _originalFileName = originalFileName;
>   int separatorIndex = 
> originalFileName.IndexOf(FileAssemblyInfo.FileAssemblySeparator);
>   if (separatorIndex < 0)
>   {
>    throw new ConfigurationException(
>    string.Format("Unable to find assembly part to load embedded resource in 
> string \"{0}\".",
>    originalFileName)); 
>   } 
>   else
>   {
>    _unresolvedFileName = originalFileName.Substring(0, separatorIndex).Trim();
>    _unresolvedAssemblyName = originalFileName.Substring(separatorIndex + 
> 1).Trim();
>   }
>  }
>  
>  // CORRECT
>  private void SplitFileAndAssemblyNames (string originalFileName) 
>  {
>   _originalFileName = originalFileName;
>   int separatorIndex = 
> originalFileName.IndexOf(FileAssemblyInfo.FileAssemblySeparator);
>   if (separatorIndex < 0)
>   {
>    _unresolvedFileName = originalFileName.Trim();
>    _unresolvedAssemblyName = null; // IsAssemblyQualified will return false
>   } 
>   else
>   {
>    _unresolvedFileName = originalFileName.Substring(0, separatorIndex).Trim();
>    _unresolvedAssemblyName = originalFileName.Substring(separatorIndex + 
> 1).Trim();
>   }
>  }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to